content: module Prometheus.Info (
      Info (..)
  ,   checkInfo
  ) where
  
  import Data.Text (Text)
  import qualified Data.Text as T
  
  -- | Meta data about a metric including its name and a help string that
  -- describes the value that the metric is measuring.
  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 == ':'
  