{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Matrix room related data types
module Network.Matrix.Room (RoomCreatePreset (..), RoomCreateRequest (..)) where

import Data.Aeson (ToJSON (..), Value (..), genericToJSON)
import qualified Data.Aeson as Aeson
import Data.Aeson.Casing (aesonPrefix, snakeCase)
import Data.Text (Text)
import GHC.Generics (Generic)

-- | https://matrix.org/docs/spec/client_server/latest#post-matrix-client-r0-createroom
data RoomCreatePreset
  = PrivateChat
  | TrustedPrivateChat
  | PublicChat
  deriving (RoomCreatePreset -> RoomCreatePreset -> Bool
(RoomCreatePreset -> RoomCreatePreset -> Bool)
-> (RoomCreatePreset -> RoomCreatePreset -> Bool)
-> Eq RoomCreatePreset
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RoomCreatePreset -> RoomCreatePreset -> Bool
$c/= :: RoomCreatePreset -> RoomCreatePreset -> Bool
== :: RoomCreatePreset -> RoomCreatePreset -> Bool
$c== :: RoomCreatePreset -> RoomCreatePreset -> Bool
Eq, Int -> RoomCreatePreset -> ShowS
[RoomCreatePreset] -> ShowS
RoomCreatePreset -> String
(Int -> RoomCreatePreset -> ShowS)
-> (RoomCreatePreset -> String)
-> ([RoomCreatePreset] -> ShowS)
-> Show RoomCreatePreset
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RoomCreatePreset] -> ShowS
$cshowList :: [RoomCreatePreset] -> ShowS
show :: RoomCreatePreset -> String
$cshow :: RoomCreatePreset -> String
showsPrec :: Int -> RoomCreatePreset -> ShowS
$cshowsPrec :: Int -> RoomCreatePreset -> ShowS
Show)

instance ToJSON RoomCreatePreset where
  toJSON :: RoomCreatePreset -> Value
toJSON RoomCreatePreset
preset = Text -> Value
String (Text -> Value) -> Text -> Value
forall a b. (a -> b) -> a -> b
$ case RoomCreatePreset
preset of
    RoomCreatePreset
PrivateChat -> Text
"private_chat"
    RoomCreatePreset
TrustedPrivateChat -> Text
"trusted_private_chat"
    RoomCreatePreset
PublicChat -> Text
"public_chat"

data RoomCreateRequest = RoomCreateRequest
  { RoomCreateRequest -> RoomCreatePreset
rcrPreset :: RoomCreatePreset,
    RoomCreateRequest -> Text
rcrRoomAliasName :: Text,
    RoomCreateRequest -> Text
rcrName :: Text,
    RoomCreateRequest -> Text
rcrTopic :: Text
  }
  deriving (RoomCreateRequest -> RoomCreateRequest -> Bool
(RoomCreateRequest -> RoomCreateRequest -> Bool)
-> (RoomCreateRequest -> RoomCreateRequest -> Bool)
-> Eq RoomCreateRequest
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RoomCreateRequest -> RoomCreateRequest -> Bool
$c/= :: RoomCreateRequest -> RoomCreateRequest -> Bool
== :: RoomCreateRequest -> RoomCreateRequest -> Bool
$c== :: RoomCreateRequest -> RoomCreateRequest -> Bool
Eq, Int -> RoomCreateRequest -> ShowS
[RoomCreateRequest] -> ShowS
RoomCreateRequest -> String
(Int -> RoomCreateRequest -> ShowS)
-> (RoomCreateRequest -> String)
-> ([RoomCreateRequest] -> ShowS)
-> Show RoomCreateRequest
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RoomCreateRequest] -> ShowS
$cshowList :: [RoomCreateRequest] -> ShowS
show :: RoomCreateRequest -> String
$cshow :: RoomCreateRequest -> String
showsPrec :: Int -> RoomCreateRequest -> ShowS
$cshowsPrec :: Int -> RoomCreateRequest -> ShowS
Show, (forall x. RoomCreateRequest -> Rep RoomCreateRequest x)
-> (forall x. Rep RoomCreateRequest x -> RoomCreateRequest)
-> Generic RoomCreateRequest
forall x. Rep RoomCreateRequest x -> RoomCreateRequest
forall x. RoomCreateRequest -> Rep RoomCreateRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RoomCreateRequest x -> RoomCreateRequest
$cfrom :: forall x. RoomCreateRequest -> Rep RoomCreateRequest x
Generic)

instance ToJSON RoomCreateRequest where
  toJSON :: RoomCreateRequest -> Value
toJSON = Options -> RoomCreateRequest -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON (Options -> RoomCreateRequest -> Value)
-> Options -> RoomCreateRequest -> Value
forall a b. (a -> b) -> a -> b
$ (ShowS -> Options
aesonPrefix ShowS
snakeCase) {omitNothingFields :: Bool
Aeson.omitNothingFields = Bool
True}