{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module ChatWork.Types.Base
( Room(..)
, Account(..)
, IconPreset(..)
, TaskStatus (..)
, AccountId
) where
import ChatWork.Utils (strLength)
import Data.Aeson (FromJSON (..), ToJSON (..),
genericParseJSON, genericToJSON)
import Data.Aeson.Casing (aesonDrop, snakeCase)
import Data.Either (partitionEithers)
import Data.Text (Text, pack, split)
import GHC.Generics (Generic)
import Web.HttpApiData
data Room = Room
{ roomToRoomId :: Int
, roomToName :: Text
, roomToIconPath :: Text
} deriving (Eq, Show, Generic)
instance ToJSON Room where
toJSON = genericToJSON $ aesonDrop (strLength "roomTo") snakeCase
instance FromJSON Room where
parseJSON = genericParseJSON $ aesonDrop (strLength "roomTo") snakeCase
data Account = Account
{ accountToAccountId :: Int
, accountToName :: Text
, accountToAvatarImageUrl :: Text
} deriving (Eq, Show, Generic)
instance ToJSON Account where
toJSON = genericToJSON $ aesonDrop (strLength "accountTo") snakeCase
instance FromJSON Account where
parseJSON = genericParseJSON $ aesonDrop (strLength "accountTo") snakeCase
data IconPreset = Group
| Check
| Document
| Meeting
| Event
| Project
| Business
| Study
| Security
| Star
| Idea
| Heart
| Magcup
| Beer
| Music
| Sports
| Travel
deriving (Bounded, Enum, Eq)
instance Show IconPreset where
show Group = "group"
show Check = "check"
show Document = "document"
show Meeting = "meeting"
show Event = "event"
show Project = "project"
show Business = "business"
show Study = "study"
show Security = "security"
show Star = "star"
show Idea = "idea"
show Heart = "heart"
show Magcup = "magcup"
show Beer = "beer"
show Music = "music"
show Sports = "sports"
show Travel = "travel"
instance ToHttpApiData IconPreset where
toUrlPiece = pack . show
instance FromHttpApiData IconPreset where
parseUrlPiece = parseBoundedUrlPiece
data TaskStatus = Open | Done deriving (Bounded, Enum, Eq)
instance Show TaskStatus where
show Open = "open"
show Done = "done"
instance ToHttpApiData TaskStatus where
toUrlPiece = pack . show
instance FromHttpApiData TaskStatus where
parseUrlPiece = parseBoundedUrlPiece
type AccountId = Int
instance (FromHttpApiData a) => FromHttpApiData [a] where
parseUrlPiece txt = if null es then Right xs else Left "abc"
where
(es, xs) = partitionEithers . fmap parseUrlPiece $ split (== ',') txt