module Web.Slack.Types.Channel where
import Data.Aeson
import Data.Aeson.Types
import Control.Applicative
import Data.Text (Text)
import Control.Lens.TH
import Data.Maybe (fromMaybe)
import Web.Slack.Types.Id
import Web.Slack.Types.Time
import Web.Slack.Types.Topic
import Web.Slack.Types.ChannelOpt (ChannelOpt)
import Prelude
data Channel = Channel { _channelId :: ChannelId
, _channelName :: Text
, _channelCreated :: Time
, _channelCreator :: UserId
, _channelIsArchived :: Maybe Bool
, _channelIsGeneral :: Bool
, _channelMembers :: Maybe [UserId]
, _channelTopic :: Maybe Topic
, _channelPurpose :: Maybe Purpose
, _channelIsMember :: Bool
, _channelOpt :: Maybe ChannelOpt
, _channelIsGroup :: Bool
} deriving Show
makeLenses ''Channel
defaultToFalse :: Object -> Text -> Parser Bool
defaultToFalse o tag = fmap (fromMaybe False) $ o .:? tag
instance FromJSON Channel where
parseJSON = withObject "Channel" (\o -> Channel <$> o .: "id" <*> o .: "name"
<*> o .: "created" <*> o .:"creator"
<*> o .:? "is_archived" <*> defaultToFalse o "is_general"
<*> o .:? "members" <*> o .:? "topic"
<*> o .:? "purpose" <*> defaultToFalse o "is_member"
<*> (pure $ parseMaybe parseJSON (Object o) :: Parser (Maybe ChannelOpt))
<*> o .:? "is_group" .!= False)