{-# LANGUAGE TemplateHaskell #-} module Web.Mackerel.Types.Authority where import Data.Aeson import qualified Data.Aeson as Aeson import Data.Aeson.Types (typeMismatch) import qualified Data.Text as Text data Authority = AuthorityOwner | AuthorityManager | AuthorityCollaborator | AuthorityViewer deriving Eq instance Show Authority where show AuthorityOwner = "owner" show AuthorityManager = "manager" show AuthorityCollaborator = "collaborator" show AuthorityViewer = "viewer" instance Read Authority where readsPrec _ xs = [ (hs, drop (length str) xs) | (hs, str) <- pairs', take (length str) xs == str ] where pairs' = [ (AuthorityOwner, "owner"), (AuthorityManager, "manager"), (AuthorityCollaborator, "collaborator"), (AuthorityViewer, "viewer")] instance FromJSON Authority where parseJSON (Aeson.String txt) | str == "owner" = return AuthorityOwner | str == "manager" = return AuthorityManager | str == "collaborator" = return AuthorityCollaborator | str == "viewer" = return AuthorityViewer where str = Text.unpack txt parseJSON o = typeMismatch "Authority" o instance ToJSON Authority where toJSON method = toJSON (show method)