{-# LANGUAGE TemplateHaskell #-} module Web.Mackerel.Types.Invitation where import Data.Aeson import qualified Data.Aeson as Aeson import Data.Aeson.TH (deriveJSON) import Data.Aeson.Types (typeMismatch) import qualified Data.Text as Text import Web.Mackerel.Internal.TH data InvitationAuthority = InvitationAuthorityManager | InvitationAuthorityCollaborator | InvitationAuthorityViewer deriving Eq instance Show InvitationAuthority where show InvitationAuthorityManager = "manager" show InvitationAuthorityCollaborator = "collaborator" show InvitationAuthorityViewer = "viewer" instance Read InvitationAuthority where readsPrec _ xs = [ (hs, drop (length str) xs) | (hs, str) <- pairs', take (length str) xs == str ] where pairs' = [(InvitationAuthorityManager, "manager"), (InvitationAuthorityCollaborator, "collaborator"), (InvitationAuthorityViewer, "viewer")] instance FromJSON InvitationAuthority where parseJSON (Aeson.String txt) | str == "manager" = return InvitationAuthorityManager | str == "collaborator" = return InvitationAuthorityCollaborator | str == "viewer" = return InvitationAuthorityViewer where str = Text.unpack txt parseJSON o = typeMismatch "InvitationAuthority" o instance ToJSON InvitationAuthority where toJSON method = toJSON (show method) data Invitation = Invitation { invitationEmail :: String, invitationAuthority :: InvitationAuthority } deriving (Eq, Show) $(deriveJSON options ''Invitation)