-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2023 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Wire.API.Event.LeaveReason where

import Data.Schema
import Imports
import Wire.Arbitrary

--  | The reason for a member to leave
--    There are three reasons
--    - the member has left on their own
--    - the member was removed from the team
--    - the member was removed by another member
data EdMemberLeftReason
  = -- | The member has left on their own
    EdReasonLeft
  | -- | The member was removed from the team and/or deleted
    EdReasonDeleted
  | -- | The member was removed by another member
    EdReasonRemoved
  deriving stock (EdMemberLeftReason -> EdMemberLeftReason -> Bool
(EdMemberLeftReason -> EdMemberLeftReason -> Bool)
-> (EdMemberLeftReason -> EdMemberLeftReason -> Bool)
-> Eq EdMemberLeftReason
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EdMemberLeftReason -> EdMemberLeftReason -> Bool
== :: EdMemberLeftReason -> EdMemberLeftReason -> Bool
$c/= :: EdMemberLeftReason -> EdMemberLeftReason -> Bool
/= :: EdMemberLeftReason -> EdMemberLeftReason -> Bool
Eq, Int -> EdMemberLeftReason -> ShowS
[EdMemberLeftReason] -> ShowS
EdMemberLeftReason -> String
(Int -> EdMemberLeftReason -> ShowS)
-> (EdMemberLeftReason -> String)
-> ([EdMemberLeftReason] -> ShowS)
-> Show EdMemberLeftReason
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EdMemberLeftReason -> ShowS
showsPrec :: Int -> EdMemberLeftReason -> ShowS
$cshow :: EdMemberLeftReason -> String
show :: EdMemberLeftReason -> String
$cshowList :: [EdMemberLeftReason] -> ShowS
showList :: [EdMemberLeftReason] -> ShowS
Show, (forall x. EdMemberLeftReason -> Rep EdMemberLeftReason x)
-> (forall x. Rep EdMemberLeftReason x -> EdMemberLeftReason)
-> Generic EdMemberLeftReason
forall x. Rep EdMemberLeftReason x -> EdMemberLeftReason
forall x. EdMemberLeftReason -> Rep EdMemberLeftReason x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. EdMemberLeftReason -> Rep EdMemberLeftReason x
from :: forall x. EdMemberLeftReason -> Rep EdMemberLeftReason x
$cto :: forall x. Rep EdMemberLeftReason x -> EdMemberLeftReason
to :: forall x. Rep EdMemberLeftReason x -> EdMemberLeftReason
Generic)
  deriving (Gen EdMemberLeftReason
Gen EdMemberLeftReason
-> (EdMemberLeftReason -> [EdMemberLeftReason])
-> Arbitrary EdMemberLeftReason
EdMemberLeftReason -> [EdMemberLeftReason]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen EdMemberLeftReason
arbitrary :: Gen EdMemberLeftReason
$cshrink :: EdMemberLeftReason -> [EdMemberLeftReason]
shrink :: EdMemberLeftReason -> [EdMemberLeftReason]
Arbitrary) via GenericUniform EdMemberLeftReason

instance ToSchema EdMemberLeftReason where
  schema :: ValueSchema NamedSwaggerDoc EdMemberLeftReason
schema =
    forall v doc a b.
(With v, HasEnum v doc) =>
Text
-> SchemaP [Value] v (Alt Maybe v) a b
-> SchemaP doc Value Value a b
enum @Text Text
"EdMemberLeftReason" (SchemaP
   [Value] Text (Alt Maybe Text) EdMemberLeftReason EdMemberLeftReason
 -> ValueSchema NamedSwaggerDoc EdMemberLeftReason)
-> SchemaP
     [Value] Text (Alt Maybe Text) EdMemberLeftReason EdMemberLeftReason
-> ValueSchema NamedSwaggerDoc EdMemberLeftReason
forall a b. (a -> b) -> a -> b
$
      [SchemaP
   [Value]
   Text
   (Alt Maybe Text)
   EdMemberLeftReason
   EdMemberLeftReason]
-> SchemaP
     [Value] Text (Alt Maybe Text) EdMemberLeftReason EdMemberLeftReason
forall a. Monoid a => [a] -> a
mconcat
        [ Text
-> EdMemberLeftReason
-> SchemaP
     [Value] Text (Alt Maybe Text) EdMemberLeftReason EdMemberLeftReason
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"left" EdMemberLeftReason
EdReasonLeft,
          Text
-> EdMemberLeftReason
-> SchemaP
     [Value] Text (Alt Maybe Text) EdMemberLeftReason EdMemberLeftReason
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"user-deleted" EdMemberLeftReason
EdReasonDeleted,
          Text
-> EdMemberLeftReason
-> SchemaP
     [Value] Text (Alt Maybe Text) EdMemberLeftReason EdMemberLeftReason
forall a b.
(ToJSON a, Eq a, Eq b) =>
a -> b -> SchemaP [Value] a (Alt Maybe a) b b
element Text
"removed" EdMemberLeftReason
EdReasonRemoved
        ]