config-value-0.5.1: src/Config/Value.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveDataTypeable #-}
#ifndef MIN_VERSION_base
#define MIN_VERSION_base(x,y,z) 1
#endif
-- | This module provides the types used in this package for configuration.
-- Visit "ConfigFile.Parser" to parse values of this type in a convenient
-- layout based notation.
module Config.Value
( Section(..)
, Value(..)
, Atom(..)
) where
import Data.Text (Text)
import Data.Data (Data, Typeable)
import Data.String (IsString(..))
#if MIN_VERSION_base(4,6,0)
import GHC.Generics (Generic)
#endif
-- | A single section of a 'Value'
--
-- Example:
--
-- * @my-key: my-value@ is @'Section' ('Atom' "my-key") ('Atom' "my-value")@
data Section = Section
{ sectionName :: Text
, sectionValue :: Value
}
deriving (Eq, Read, Show, Typeable, Data
#if MIN_VERSION_base(4,6,0)
, Generic
#endif
)
-- | Wrapper to distinguish 'Atom' from 'Text' by
-- type in a configuration. Atoms can be constructed
-- using the @OverloadedStrings@ extension.
newtype Atom = MkAtom { atomName :: Text }
deriving (Eq, Ord, Show, Read, Typeable, Data
#if MIN_VERSION_base(4,6,0)
, Generic
#endif
)
instance IsString Atom where
fromString = MkAtom . fromString
-- | Sum type of the values supported by this language.
--
-- The first field of the 'Number' constructor is the based used in the concrete
-- syntax of the configuration value.
--
-- The 'Floating' constructor stores the coefficient and power-of-10 exponent used in
-- the concrete syntax. This allows representing numbers that would
-- otherwise overflow a 'Double'.
--
-- Examples:
--
-- * @0xff@ is @'Number' 16 255@
--
-- * @123@ is @'Number' 10 123@
--
-- * @123e10@ is @'Floating' 123 10@
-- * @123.45@ is @'Floating' 12345 (-2)@
data Value
= Sections [Section] -- ^ lists of key-value pairs
| Number Int Integer -- ^ integer literal base (2, 8, 10, or 16) and integer value
| Floating Integer Integer -- ^ coef exponent: coef * 10 ^ exponent
| Text Text -- ^ quoted strings
| Atom Atom -- ^ unquoted strings
| List [Value] -- ^ lists
deriving (Eq, Read, Show, Typeable, Data
#if MIN_VERSION_base(4,6,0)
, Generic
#endif
)