{-# LANGUAGE TemplateHaskell #-} module Web.Mackerel.Types.Monitor where import Data.Aeson import qualified Data.Aeson as Aeson import Data.Aeson.TH (deriveJSON, SumEncoding(..), sumEncoding, constructorTagModifier, fieldLabelModifier) import Data.Aeson.Types (typeMismatch) import Data.Char (toLower) import Data.List (isSuffixOf) import qualified Data.Text as Text import Web.Mackerel.Internal.TH data MonitorId = MonitorId String deriving (Eq, Show) instance FromJSON MonitorId where parseJSON (Aeson.String monitorId') = return $ MonitorId $ Text.unpack monitorId' parseJSON o = typeMismatch "MonitorId" o instance ToJSON MonitorId where toJSON (MonitorId monitorId') = toJSON monitorId' data MonitorOperator = MonitorGreaterThan | MonitorLessThan deriving Eq instance Show MonitorOperator where show MonitorGreaterThan = ">" show MonitorLessThan = "<" instance Read MonitorOperator where readsPrec _ xs = [ (op, drop 1 xs) | (op, opstr) <- [(MonitorGreaterThan, ">"), (MonitorLessThan, "<")], take 1 xs == opstr ] instance FromJSON MonitorOperator where parseJSON (Aeson.String str) | Text.unpack str == ">" = return MonitorGreaterThan | Text.unpack str == "<" = return MonitorLessThan parseJSON o = typeMismatch "MonitorOperator" o instance ToJSON MonitorOperator where toJSON op = toJSON (show op) data MonitorExternalMethod = MonitorExternalMethodGET | MonitorExternalMethodPOST | MonitorExternalMethodPUT | MonitorExternalMethodDELETE deriving Eq instance Show MonitorExternalMethod where show MonitorExternalMethodGET = "GET" show MonitorExternalMethodPOST = "POST" show MonitorExternalMethodPUT = "PUT" show MonitorExternalMethodDELETE = "DELETE" instance Read MonitorExternalMethod where readsPrec _ xs = [ (hs, drop (length str) xs) | (hs, str) <- pairs', take (length str) xs == str ] where pairs' = [(MonitorExternalMethodGET, "GET"), (MonitorExternalMethodPOST, "POST"), (MonitorExternalMethodPUT, "PUT"), (MonitorExternalMethodDELETE, "DELETE")] instance FromJSON MonitorExternalMethod where parseJSON (Aeson.String txt) | str == "GET" = return MonitorExternalMethodGET | str == "POST" = return MonitorExternalMethodPOST | str == "PUT" = return MonitorExternalMethodPUT | str == "DELETE" = return MonitorExternalMethodDELETE where str = Text.unpack txt parseJSON o = typeMismatch "MonitorExternalMethod" o instance ToJSON MonitorExternalMethod where toJSON method = toJSON (show method) data MonitorExternalHeader = MonitorExternalHeader { monitorHeaderName :: String, monitorHeaderValue :: String } deriving (Eq, Show) $(deriveJSON options { fieldLabelModifier = map toLower . drop 13 } ''MonitorExternalHeader) data MonitorType = MonitorTypeConnectivity | MonitorTypeHost | MonitorTypeService | MonitorTypeExternal | MonitorTypeCheck | MonitorTypeExpression deriving (Eq, Show) $(deriveJSON options { constructorTagModifier = map toLower . drop 11 } ''MonitorType) data Monitor = MonitorHost { monitorId :: Maybe MonitorId, monitorName :: String, monitorMemo :: Maybe String, monitorDuration :: Integer, monitorMetric :: String, monitorOperator :: MonitorOperator, monitorWarning :: Double, monitorCritical :: Double, monitorIsMute :: Maybe Bool, monitorNotificationInterval :: Maybe Integer, monitorScopes :: Maybe [String], monitorExcludeScopes :: Maybe [String] } | MonitorConnectivity { monitorId :: Maybe MonitorId, monitorName :: String, monitorMemo :: Maybe String, monitorIsMute :: Maybe Bool, monitorNotificationInterval :: Maybe Integer, monitorScopes :: Maybe [String], monitorExcludeScopes :: Maybe [String] } | MonitorService { monitorId :: Maybe MonitorId, monitorName :: String, monitorMemo :: Maybe String, monitorService :: String, monitorDuration :: Integer, monitorMetric :: String, monitorOperator :: MonitorOperator, monitorWarning :: Double, monitorCritical :: Double, monitorIsMute :: Maybe Bool, monitorNotificationInterval :: Maybe Integer } | MonitorExternal { monitorId :: Maybe MonitorId, monitorName :: String, monitorMemo :: Maybe String, monitorMethod :: Maybe MonitorExternalMethod, monitorUrl :: String, monitorRequestBody :: Maybe String, monitorHeaders :: Maybe [MonitorExternalHeader], monitorServiceOption :: Maybe String, monitorResponseTimeDuration :: Maybe Double, monitorResponseTimeWarning :: Maybe Double, monitorResponseTimeCritical :: Maybe Double, monitorContainsString :: Maybe String, monitorMaxCheckAttempts :: Maybe Integer, monitorCertificationExpirationWarning :: Maybe Integer, monitorCertificationExpirationCritical :: Maybe Integer, monitorSkipCertificateVerification :: Maybe Bool, monitorIsMute :: Maybe Bool, monitorNotificationInterval :: Maybe Integer } | MonitorExpression { monitorId :: Maybe MonitorId, monitorName :: String, monitorMemo :: Maybe String, monitorExpression :: String, monitorOperator :: MonitorOperator, monitorWarning :: Double, monitorCritical :: Double, monitorIsMute :: Maybe Bool, monitorNotificationInterval :: Maybe Integer } deriving (Eq, Show) $(deriveJSON options { sumEncoding = TaggedObject "type" "type", constructorTagModifier = map toLower . drop 7, fieldLabelModifier = \xs -> let ys = fieldLabelModifier options xs in if "Option" `isSuffixOf` ys then take (length ys - 6) ys else ys } ''Monitor)