-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | parser for config files, shell variables, command line args. -- -- See README @package configifier @version 0.0.8 module Data.Configifier -- | Construction of config records (cons for record fields). data (:*>) a b (:*>) :: a -> b -> (:*>) a b -- | Construction of config record fields. data (:>) (s :: Symbol) (t :: *) -- | Add descriptive text to record field for documentation. data (:>:) a (s :: Symbol) data ConfigCode k Record :: (ConfigCode k) -> (ConfigCode k) -> ConfigCode k Label :: Symbol -> (ConfigCode k) -> ConfigCode k Descr :: (ConfigCode k) -> Symbol -> ConfigCode k List :: (ConfigCode k) -> ConfigCode k Option :: (ConfigCode k) -> ConfigCode k Type :: k -> ConfigCode k -- | Map user-provided config type to ConfigCode types. -- | Deprecated: use of NoDesc is redundant and can be dropped without -- replacement. -- | Map ConfgCode types to the types of config values. -- | MaybeO is isomorphic to Maybe, but is only used for -- Option values. data MaybeO a JustO :: a -> MaybeO a NothingO :: MaybeO a -- | Transformers' Identity is not in Typeable, so we roll -- our own. It's also less work to write. data Id a Id :: a -> Id a data Source YamlString :: SBS -> Source YamlFile :: FilePath -> Source ShellEnv :: [(String, String)] -> Source CommandLine :: [String] -> Source data ConfigFile data ShellEnv data CommandLine data Tagged cfg Tagged :: ToConfig cfg Id -> Tagged cfg [fromTagged] :: Tagged cfg -> ToConfig cfg Id data TaggedM cfg TaggedM :: ToConfig cfg Maybe -> TaggedM cfg [fromTaggedM] :: TaggedM cfg -> ToConfig cfg Maybe data Error InvalidYamlString :: SBS -> ParseException -> Error [invalidYamlInput] :: Error -> SBS [invalidYamlMsg] :: Error -> ParseException InvalidYamlFile :: FilePath -> ParseException -> Error [invalidYamlFile] :: Error -> FilePath [invalidYamlMsg] :: Error -> ParseException ShellEnvNil :: Error ShellEnvNoParse :: String -> String -> String -> Error [shellEnvNoParseType] :: Error -> String [shellEnvNoParseValue] :: Error -> String [shellEnvNoParseMsg] :: Error -> String CommandLinePrimitiveParseError :: String -> Error CommandLinePrimitiveOtherError :: Error -> Error FreezeIncomplete :: [String] -> Error [freezeIncompleteAtPath] :: Error -> [String] configify :: (tm ~ TaggedM cfg, Show tm, Monoid tm, Freeze cfg, FromJSON tm, HasParseShellEnv cfg, HasParseCommandLine cfg, CanonicalizePartial cfg) => [Source] -> IO (Tagged cfg) configifyWithDefault :: (tm ~ TaggedM cfg, Show tm, Monoid tm, Freeze cfg, FromJSON tm, HasParseShellEnv cfg, HasParseCommandLine cfg, CanonicalizePartial cfg) => tm -> [Source] -> IO (Tagged cfg) -- | From a list of config file paths, construct a source list that (1) -- reads those files allowing for recursive includes; then (2) processes -- shell environment variables (with getProgName as prefix), and -- finally (3) processes command line args, turning --config -- arguments into further recursive config file loads. -- -- File path arguments are optiona; config paths to non-existent files -- are silently dropped. defaultSources :: [FilePath] -> IO [Source] -- | Require that all shell env variables start with executable name. (This -- is just a call to requireShellEnvPrefix' with the result of -- progName.) withShellEnvPrefix :: Env -> IO Env -- | Handle `--config=<FILE>`, `--config FILE`: split up -- CommandLine source on each of these, and inject a -- YamlFile source with the resp. file name. readUserConfigFiles :: [Source] -> [Source] -- | Require prefix for shell env variables. This function will chop off -- the given prefix of all env entries, and filter all entries that do -- not have this prefix. withShellEnvPrefix' :: String -> Env -> Env parseConfigFile :: (FromJSON (TaggedM cfg)) => SBS -> Either Error (TaggedM cfg) -- | See Data.Yaml.Include. parseConfigFileWithIncludes :: (FromJSON (TaggedM cfg)) => FilePath -> IO (Either Error (TaggedM cfg)) renderConfigFile :: (Freeze cfg, t ~ Tagged cfg, ToJSON (TaggedM cfg)) => t -> SBS -- |
-- instance ToJSON Record ---- |
-- instance ToJSON Label ---- |
-- instance ToJSON List ---- |
-- instance ToJSON Option ---- |
-- instance ToJSON Type ---- |
-- instance FromJSON Record ---- | instance FromJSON Label (tolerates unknown fields in json -- object.) -- |
-- instance ParseJSON List ---- |
-- instance ParseJSON Option ---- |
-- instance FromJSON Type --type Env = [(String, String)] class HasParseShellEnv (cfg :: ConfigCode *) parseShellEnv :: HasParseShellEnv cfg => Env -> Either Error (TaggedM cfg) -- | The paths into the recursive structure of the config file are -- concatenated to shell variable names with separating '_'. (It is still -- ok to have '_' in your config path names. This parser chops off -- complete matching names, whether they contain '_' or not, and only -- then worries about trailing '_'.) -- | You can provide a list value via the shell environment by providing a -- single element. This element will be put into a list implicitly. -- -- (A more general approach that allows for yaml-encoded list values in -- shell variables is more tricky to design, implement, and use: If you -- have a list of sub-configs and don't want the entire sub-config to be -- yaml-encoded, but use a longer shell variable name to go further down -- to deeper sub-configs, there is a lot of ambiguity. It may be possible -- to resolve that at run-time, but it's more tricky.) type Args = [String] class HasParseCommandLine cfg parseCommandLine :: HasParseCommandLine cfg => [String] -> Either Error (TaggedM cfg) -- | Very basic first approach: read --(key)(=|s+)(value); -- construct shell env from keys and names, and use parseShellEnv -- on the command line. If it doesn't like the syntax used in the command -- line, it will crash. I hope for this to get much fancier in the -- future. primitiveParseCommandLine :: (HasParseShellEnv cfg) => [String] -> Either Error (TaggedM cfg) parseArgs :: Args -> Either String Env popArg :: Args -> Either String ((String, String), Args) parseArgsWithEqSign :: String -> Either String (String, String) parseArgsWithSpace :: String -> String -> Either String (String, String) parseArgName :: String -> String -- | Map a Tagged config value and a type-level path to the part of -- the config value the path points to. Trigger an informative type error -- if path does not exist. (>>.) :: (Sel cfg ps, ToValE cfg ps ~ Done r) => Tagged cfg -> Proxy ps -> r -- | Map ConfgCode types to the types of config values. -- | This is <|> on Maybe lifted to the type level. -- | Compile-time Maybe. Type-level Just / Nothing (as -- produced by ToVal) are embedded in each constructor, resp.. -- Since Just and Nothing are different types, -- CNothing and CJust can be distinguished by the type -- checker. data CMaybe (a :: Maybe *) CNothing :: CMaybe Nothing CJust :: a -> CMaybe (Just a) -- | This is a version of <|> on Maybe for -- CMaybe. orElse :: CMaybe a -> CMaybe b -> CMaybe (OrElse a b) toValueMaybe :: CMaybe a -> CMaybe (ToValueMaybe a) class NothingValue (a :: Maybe *) nothingValue :: NothingValue a => Proxy a -> CMaybe (ToValueMaybe a) class Sel cfg ps sel :: Sel cfg ps => Tagged cfg -> Proxy ps -> CMaybe (ToVal cfg ps) -- | Helper class for disambiguating overlaps. The trick is that the -- Sel instance based on the Sel' constraint is more -- general than all other instances, so OverlappingInstances -- will ensure it is matched last. This way, no instance of Sel' -- can wrongly overlap with any instance of Sel. class Sel' cfg ps sel' :: Sel' cfg ps => Tagged cfg -> Proxy ps -> CMaybe (ToVal cfg ps) type ToValE (a :: ConfigCode *) (p :: [Symbol]) = ToExc (LookupFailed a p) (ToVal a p) data Exc a b Fail :: a -> Exc a b Done :: b -> Exc a b data LookupFailed a p merge :: (tm ~ TaggedM cfg, ti ~ Tagged cfg, Freeze cfg, Monoid tm, CanonicalizePartial cfg) => [tm] -> Either Error ti freeze :: (tm ~ TaggedM cfg, ti ~ Tagged cfg, Freeze cfg) => tm -> Either Error ti thaw :: (tm ~ TaggedM cfg, ti ~ Tagged cfg, Freeze cfg) => ti -> tm -- | If one of two configs is Nothing, do the expected thing. If -- both are Just, append the values. -- | There is no instance Monoid (TaggedM (Type a)), since there -- is no reasonable mempty. Therefore, we offer a specialized -- instance for labels that map to Type. -- | Lists are initialized empty by default. Append overwrites left values -- with right values. (If we tried to append list elements recursively, -- there would be awkward questions about matching list lengths.) class Freeze c frz :: Freeze c => Proxy c -> [String] -> ToConfig c Maybe -> Either Error (ToConfig c Id) thw :: Freeze c => Proxy c -> ToConfig c Id -> ToConfig c Maybe -- | FIXME: if a non-optional part of an optional sub-config is missing, -- the FreezeIncomplete error is ignored and the entire sub-config -- is cleared. it would be better to distinguish between the cases -- `sub-config missing` and `sub-config provided incompletely`, and still -- raise an error in the latter. -- | Partials are constructed with every Nothing spelled out, -- resulting in deep skeletons of Nothings. -- CanonicalizePartial replaces those with single Nothings -- at their tops. class CanonicalizePartial a canonicalizePartial :: CanonicalizePartial a => TaggedM a -> TaggedM a emptyPartial :: CanonicalizePartial a => TaggedM a -> Bool docs :: (HasToDoc a, HasRenderDoc ConfigFile, HasRenderDoc ShellEnv, HasRenderDoc CommandLine) => Proxy a -> ST data Doc DocDict :: [(String, Maybe String, Doc, DocOptional)] -> Doc DocList :: Doc -> Doc DocType :: String -> Doc data DocOptional DocMandatory :: DocOptional DocOptional :: DocOptional concatDoc :: Doc -> Doc -> Doc class HasToDoc (a :: ConfigCode *) toDoc :: HasToDoc a => Proxy a -> Doc class HasRenderDoc t renderDoc :: HasRenderDoc t => Proxy t -> Doc -> ST -- | QuasiQuoter for config files. cfgify :: QuasiQuoter instance GHC.Read.Read Data.Configifier.Doc instance GHC.Show.Show Data.Configifier.Doc instance GHC.Classes.Ord Data.Configifier.Doc instance GHC.Classes.Eq Data.Configifier.Doc instance GHC.Read.Read Data.Configifier.DocOptional instance GHC.Show.Show Data.Configifier.DocOptional instance GHC.Classes.Ord Data.Configifier.DocOptional instance GHC.Classes.Eq Data.Configifier.DocOptional instance GHC.Show.Show Data.Configifier.Error instance GHC.Show.Show Data.Configifier.Source instance GHC.Classes.Ord Data.Configifier.Source instance GHC.Classes.Eq Data.Configifier.Source instance GHC.Show.Show a => GHC.Show.Show (Data.Configifier.Id a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Configifier.Id a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Configifier.Id a) instance GHC.Show.Show a => GHC.Show.Show (Data.Configifier.MaybeO a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Configifier.MaybeO a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Configifier.MaybeO a) instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (a Data.Configifier.:*> b) instance (GHC.Classes.Ord a, GHC.Classes.Ord b) => GHC.Classes.Ord (a Data.Configifier.:*> b) instance (GHC.Classes.Eq a, GHC.Classes.Eq b) => GHC.Classes.Eq (a Data.Configifier.:*> b) instance GHC.Classes.Eq (Data.Configifier.ToConfig cfg Data.Configifier.Id) => GHC.Classes.Eq (Data.Configifier.Tagged cfg) instance GHC.Classes.Eq (Data.Configifier.ToConfig cfg GHC.Base.Maybe) => GHC.Classes.Eq (Data.Configifier.TaggedM cfg) instance GHC.Show.Show (Data.Configifier.ToConfig cfg Data.Configifier.Id) => GHC.Show.Show (Data.Configifier.Tagged cfg) instance GHC.Show.Show (Data.Configifier.ToConfig cfg GHC.Base.Maybe) => GHC.Show.Show (Data.Configifier.TaggedM cfg) instance GHC.Exception.Exception Data.Configifier.Error instance (t1 ~ Data.Configifier.ToConfig cfg1 GHC.Base.Maybe, Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM cfg1), t2 ~ Data.Configifier.ToConfig cfg2 GHC.Base.Maybe, Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM cfg2)) => Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM ('Data.Configifier.Record cfg1 cfg2)) instance (Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM cfg), GHC.TypeLits.KnownSymbol s) => Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM ('Data.Configifier.Label s cfg)) instance (Data.Configifier.ToConfig ('Data.Configifier.Descr cfg s) GHC.Base.Maybe ~ Data.Configifier.ToConfig cfg GHC.Base.Maybe, Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM cfg)) => Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM ('Data.Configifier.Descr cfg s)) instance (t ~ Data.Configifier.ToConfig cfg GHC.Base.Maybe, Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM cfg)) => Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM ('Data.Configifier.List cfg)) instance (t ~ Data.Configifier.ToConfig cfg GHC.Base.Maybe, Data.Configifier.ToConfig ('Data.Configifier.Option cfg) GHC.Base.Maybe ~ Data.Configifier.MaybeO t'', Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM cfg)) => Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM ('Data.Configifier.Option cfg)) instance Data.Aeson.Types.Class.ToJSON a => Data.Aeson.Types.Class.ToJSON (Data.Configifier.TaggedM ('Data.Configifier.Type a)) instance (Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM cfg1), Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM cfg2)) => Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM ('Data.Configifier.Record cfg1 cfg2)) instance (Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM cfg), GHC.TypeLits.KnownSymbol s) => Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM ('Data.Configifier.Label s cfg)) instance (Data.Configifier.ToConfig ('Data.Configifier.Descr cfg s) GHC.Base.Maybe ~ Data.Configifier.ToConfig cfg GHC.Base.Maybe, Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM cfg)) => Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM ('Data.Configifier.Descr cfg s)) instance Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM cfg) => Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM ('Data.Configifier.List cfg)) instance Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM cfg) => Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM ('Data.Configifier.Option cfg)) instance Data.Aeson.Types.Class.FromJSON a => Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM ('Data.Configifier.Type a)) instance (Data.Configifier.HasParseShellEnv a, Data.Configifier.HasParseShellEnv b) => Data.Configifier.HasParseShellEnv ('Data.Configifier.Record a b) instance (GHC.TypeLits.KnownSymbol path, Data.Configifier.HasParseShellEnv a) => Data.Configifier.HasParseShellEnv ('Data.Configifier.Label path a) instance (Data.Configifier.ToConfig ('Data.Configifier.Descr cfg s) GHC.Base.Maybe ~ Data.Configifier.ToConfig cfg GHC.Base.Maybe, Data.Configifier.HasParseShellEnv cfg) => Data.Configifier.HasParseShellEnv ('Data.Configifier.Descr cfg s) instance Data.Configifier.HasParseShellEnv a => Data.Configifier.HasParseShellEnv ('Data.Configifier.List a) instance Data.Configifier.HasParseShellEnv a => Data.Configifier.HasParseShellEnv ('Data.Configifier.Option a) instance (Data.Typeable.Internal.Typeable a, Data.Aeson.Types.Class.FromJSON (Data.Configifier.TaggedM ('Data.Configifier.Type a))) => Data.Configifier.HasParseShellEnv ('Data.Configifier.Type a) instance Data.Configifier.HasParseShellEnv cfg => Data.Configifier.HasParseCommandLine cfg instance Data.Configifier.NothingValue 'GHC.Base.Nothing instance Data.Configifier.NothingValue ('GHC.Base.Just x) instance Data.Configifier.Sel ('Data.Configifier.Record cfg' cfg'') '[] instance (cfg ~ 'Data.Configifier.Record cfg' cfg'', Data.Configifier.Sel cfg' (p : ps), Data.Configifier.Sel cfg'' (p : ps)) => Data.Configifier.Sel ('Data.Configifier.Record cfg' cfg'') (p : ps) instance (cfg ~ 'Data.Configifier.Label p cfg', Data.Configifier.Sel cfg' ps, GHC.TypeLits.KnownSymbol p) => Data.Configifier.Sel ('Data.Configifier.Label p cfg') (p : ps) instance (cfg ~ 'Data.Configifier.Descr cfg' s, Data.Configifier.Sel cfg' ps, Data.Configifier.ToConfig ('Data.Configifier.Descr cfg' s) Data.Configifier.Id ~ Data.Configifier.ToConfig cfg' Data.Configifier.Id) => Data.Configifier.Sel ('Data.Configifier.Descr cfg' s) ps instance (cfg ~ 'Data.Configifier.Option cfg', Data.Configifier.NothingValue (Data.Configifier.ToVal cfg' ps), Data.Configifier.Sel cfg' ps) => Data.Configifier.Sel ('Data.Configifier.Option cfg') ps instance Data.Configifier.Sel' cfg ps => Data.Configifier.Sel cfg ps instance (t ~ Data.Configifier.ToConfig cfg Data.Configifier.Id, Data.Configifier.ToVal cfg '[] ~ 'GHC.Base.Just t) => Data.Configifier.Sel' cfg '[] instance (Data.Configifier.ToVal cfg (p : ps) ~ 'GHC.Base.Nothing) => Data.Configifier.Sel' cfg (p : ps) instance (GHC.Base.Monoid (Data.Configifier.TaggedM a), GHC.Base.Monoid (Data.Configifier.TaggedM b)) => GHC.Base.Monoid (Data.Configifier.TaggedM ('Data.Configifier.Record a b)) instance GHC.Base.Monoid (Data.Configifier.TaggedM a) => GHC.Base.Monoid (Data.Configifier.TaggedM ('Data.Configifier.Label s a)) instance (Data.Configifier.ToConfig ('Data.Configifier.Descr a s) GHC.Base.Maybe ~ Data.Configifier.ToConfig a GHC.Base.Maybe, Data.Configifier.ToConfig a GHC.Base.Maybe ~ GHC.Base.Maybe a', GHC.Base.Monoid (Data.Configifier.TaggedM a)) => GHC.Base.Monoid (Data.Configifier.TaggedM ('Data.Configifier.Descr a s)) instance GHC.Base.Monoid (Data.Configifier.TaggedM ('Data.Configifier.Label s ('Data.Configifier.Type a))) instance GHC.Base.Monoid (Data.Configifier.TaggedM ('Data.Configifier.List a)) instance GHC.Base.Monoid (Data.Configifier.TaggedM a) => GHC.Base.Monoid (Data.Configifier.TaggedM ('Data.Configifier.Option a)) instance (Data.Configifier.Freeze a, Data.Configifier.Freeze b) => Data.Configifier.Freeze ('Data.Configifier.Record a b) instance (GHC.TypeLits.KnownSymbol s, Data.Configifier.Freeze t) => Data.Configifier.Freeze ('Data.Configifier.Label s t) instance (Data.Configifier.ToConfig ('Data.Configifier.Descr t s) GHC.Base.Maybe ~ Data.Configifier.ToConfig t GHC.Base.Maybe, Data.Configifier.ToConfig ('Data.Configifier.Descr t s) Data.Configifier.Id ~ Data.Configifier.ToConfig t Data.Configifier.Id, Data.Configifier.Freeze t) => Data.Configifier.Freeze ('Data.Configifier.Descr t s) instance Data.Configifier.Freeze c => Data.Configifier.Freeze ('Data.Configifier.List c) instance (Data.Configifier.ToConfig ('Data.Configifier.Option c) GHC.Base.Maybe ~ Data.Configifier.MaybeO tm, Data.Configifier.ToConfig ('Data.Configifier.Option c) Data.Configifier.Id ~ Data.Configifier.MaybeO ti, tm ~ Data.Configifier.ToConfig c GHC.Base.Maybe, ti ~ Data.Configifier.ToConfig c Data.Configifier.Id, Data.Configifier.Freeze c) => Data.Configifier.Freeze ('Data.Configifier.Option c) instance Data.Configifier.Freeze ('Data.Configifier.Type c) instance (Data.Configifier.CanonicalizePartial cfg, Data.Configifier.CanonicalizePartial cfg') => Data.Configifier.CanonicalizePartial ('Data.Configifier.Record cfg cfg') instance (cfg ~ 'Data.Configifier.Label s cfg', Data.Configifier.CanonicalizePartial cfg') => Data.Configifier.CanonicalizePartial ('Data.Configifier.Label s cfg') instance (cfg ~ 'Data.Configifier.Descr cfg' s, Data.Configifier.CanonicalizePartial cfg') => Data.Configifier.CanonicalizePartial ('Data.Configifier.Descr cfg' s) instance (cfg ~ 'Data.Configifier.List cfg', Data.Configifier.CanonicalizePartial cfg') => Data.Configifier.CanonicalizePartial ('Data.Configifier.List cfg') instance (cfg ~ 'Data.Configifier.Option cfg', Data.Configifier.CanonicalizePartial cfg') => Data.Configifier.CanonicalizePartial ('Data.Configifier.Option cfg') instance Data.Configifier.CanonicalizePartial ('Data.Configifier.Type a) instance (Data.Configifier.HasToDoc a, Data.Configifier.HasToDoc b) => Data.Configifier.HasToDoc ('Data.Configifier.Record a b) instance (GHC.TypeLits.KnownSymbol path, Data.Configifier.HasToDoc a) => Data.Configifier.HasToDoc ('Data.Configifier.Label path a) instance (Data.Configifier.HasToDoc a, GHC.TypeLits.KnownSymbol path, GHC.TypeLits.KnownSymbol descr) => Data.Configifier.HasToDoc ('Data.Configifier.Descr ('Data.Configifier.Label path a) descr) instance Data.Configifier.HasToDoc a => Data.Configifier.HasToDoc ('Data.Configifier.List a) instance Data.Configifier.HasToDoc a => Data.Configifier.HasToDoc ('Data.Configifier.Option a) instance Data.Typeable.Internal.Typeable a => Data.Configifier.HasToDoc ('Data.Configifier.Type a) instance Data.Configifier.HasRenderDoc Data.Configifier.ConfigFile instance Data.Configifier.HasRenderDoc Data.Configifier.ShellEnv instance Data.Configifier.HasRenderDoc Data.Configifier.CommandLine