module Prometheus.Info (
Info (..)
, checkInfo
) where
import Data.Text (Text)
import qualified Data.Text as T
data Info = Info {
metricName :: Text
, metricHelp :: Text
} deriving (Read, Show, Eq, Ord)
checkInfo :: Info -> a -> a
checkInfo info a
| (x:_) <- T.unpack name, not $ validStart x = errorInvalid
| (_:xs) <- T.unpack name, not $ all validRest xs = errorInvalid
| ('_':'_':_) <- T.unpack name = errorPrefix
| [] <- T.unpack name = errorEmpty
| otherwise = a
where
name = metricName info
errorInvalid = error $ concat [
"The metric '", T.unpack name, "' contains invalid characters."
]
errorPrefix = error $ concat [
"The metric '", T.unpack name, "' cannot start with '__'."
]
errorEmpty = error "Empty metric names are not allowed."
validStart c = ('a' <= c && c <= 'z')
|| ('A' <= c && c <= 'Z')
|| c == '_'
|| c == ':'
validRest c = ('a' <= c && c <= 'z')
|| ('A' <= c && c <= 'Z')
|| ('0' <= c && c <= '9')
|| c == '_'
|| c == ':'