opt-env-conf 0.9.0.0 → 0.10.0.0
raw patch · 7 files changed
+87/−10 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ OptEnvConf: unprefixedConf :: HasCodec a => String -> Builder a
+ OptEnvConf: unprefixedConfWith :: String -> ValueCodec void a -> Builder a
+ OptEnvConf: unprefixedConfWith' :: String -> ValueCodec void (Maybe a) -> Builder a
+ OptEnvConf: unprefixedEnv :: String -> Builder a
+ OptEnvConf.Setting: EnvVarSetting :: !String -> !Bool -> EnvVarSetting
+ OptEnvConf.Setting: [configValSettingAllowPrefix] :: ConfigValSetting a -> !Bool
+ OptEnvConf.Setting: [envVarSettingAllowPrefix] :: EnvVarSetting -> !Bool
+ OptEnvConf.Setting: [envVarSettingVar] :: EnvVarSetting -> !String
+ OptEnvConf.Setting: data EnvVarSetting
+ OptEnvConf.Setting: instance Data.Hashable.Class.Hashable OptEnvConf.Setting.EnvVarSetting
+ OptEnvConf.Setting: instance GHC.Classes.Eq OptEnvConf.Setting.EnvVarSetting
+ OptEnvConf.Setting: instance GHC.Show.Show OptEnvConf.Setting.EnvVarSetting
+ OptEnvConf.Setting: prefixEnvVarSetting :: String -> EnvVarSetting -> EnvVarSetting
+ OptEnvConf.Setting: suffixEnvVarSetting :: String -> EnvVarSetting -> EnvVarSetting
+ OptEnvConf.Setting: unprefixedConf :: HasCodec a => String -> Builder a
+ OptEnvConf.Setting: unprefixedConfWith :: String -> ValueCodec void a -> Builder a
+ OptEnvConf.Setting: unprefixedConfWith' :: String -> ValueCodec void (Maybe a) -> Builder a
+ OptEnvConf.Setting: unprefixedEnv :: String -> Builder a
- OptEnvConf: strArgument :: HasCallStack => IsString string => [Builder string] -> Parser string
+ OptEnvConf: strArgument :: (HasCallStack, IsString string) => [Builder string] -> Parser string
- OptEnvConf: strOption :: HasCallStack => IsString string => [Builder string] -> Parser string
+ OptEnvConf: strOption :: (HasCallStack, IsString string) => [Builder string] -> Parser string
- OptEnvConf: subSettings :: HasCallStack => HasParser a => String -> Parser a
+ OptEnvConf: subSettings :: (HasCallStack, HasParser a) => String -> Parser a
- OptEnvConf.Nix: renderSettingsNixOptions :: forall a. HasParser a => Text
+ OptEnvConf.Nix: renderSettingsNixOptions :: HasParser a => Text
- OptEnvConf.NonDet: liftNonDetTList :: Applicative m => [a] -> NonDetT m a
+ OptEnvConf.NonDet: liftNonDetTList :: forall (m :: Type -> Type) a. Applicative m => [a] -> NonDetT m a
- OptEnvConf.Parser: [ParserAllOrNothing] :: !Maybe SrcLoc -> !Parser a -> Parser a
+ OptEnvConf.Parser: [ParserAllOrNothing] :: forall a. !Maybe SrcLoc -> !Parser a -> Parser a
- OptEnvConf.Parser: [ParserAlt] :: !Parser a -> !Parser a -> Parser a
+ OptEnvConf.Parser: [ParserAlt] :: forall a. !Parser a -> !Parser a -> Parser a
- OptEnvConf.Parser: [ParserAp] :: !Parser (a -> b) -> !Parser a -> Parser b
+ OptEnvConf.Parser: [ParserAp] :: forall a1 a. !Parser (a1 -> a) -> !Parser a1 -> Parser a
- OptEnvConf.Parser: [ParserCheck] :: !Maybe SrcLoc -> !Bool -> !a -> IO (Either String b) -> !Parser a -> Parser b
+ OptEnvConf.Parser: [ParserCheck] :: forall a1 a. !Maybe SrcLoc -> !Bool -> !a1 -> IO (Either String a) -> !Parser a1 -> Parser a
- OptEnvConf.Parser: [ParserCommands] :: !Maybe SrcLoc -> !Maybe String -> ![Command a] -> Parser a
+ OptEnvConf.Parser: [ParserCommands] :: forall a. !Maybe SrcLoc -> !Maybe String -> ![Command a] -> Parser a
- OptEnvConf.Parser: [ParserEmpty] :: !Maybe SrcLoc -> Parser a
+ OptEnvConf.Parser: [ParserEmpty] :: forall a. !Maybe SrcLoc -> Parser a
- OptEnvConf.Parser: [ParserMany] :: !Parser a -> Parser [a]
+ OptEnvConf.Parser: [ParserMany] :: forall a1. !Parser a1 -> Parser [a1]
- OptEnvConf.Parser: [ParserPure] :: !a -> Parser a
+ OptEnvConf.Parser: [ParserPure] :: forall a. !a -> Parser a
- OptEnvConf.Parser: [ParserSelect] :: !Parser (Either a b) -> !Parser (a -> b) -> Parser b
+ OptEnvConf.Parser: [ParserSelect] :: forall a1 a. !Parser (Either a1 a) -> !Parser (a1 -> a) -> Parser a
- OptEnvConf.Parser: [ParserSetting] :: !Maybe SrcLoc -> !Setting a -> Parser a
+ OptEnvConf.Parser: [ParserSetting] :: forall a. !Maybe SrcLoc -> !Setting a -> Parser a
- OptEnvConf.Parser: [ParserSome] :: !Parser a -> Parser (NonEmpty a)
+ OptEnvConf.Parser: [ParserSome] :: forall a1. !Parser a1 -> Parser (NonEmpty a1)
- OptEnvConf.Parser: [ParserWithConfig] :: !Maybe SrcLoc -> !Parser (Maybe Object) -> !Parser a -> Parser a
+ OptEnvConf.Parser: [ParserWithConfig] :: forall a. !Maybe SrcLoc -> !Parser (Maybe Object) -> !Parser a -> Parser a
- OptEnvConf.Parser: class () => Functor (f :: Type -> Type)
+ OptEnvConf.Parser: class Functor (f :: Type -> Type)
- OptEnvConf.Parser: commandTraverseSetting :: forall f s. Applicative f => (forall a. Setting a -> f (Setting a)) -> Command s -> f (Command s)
+ OptEnvConf.Parser: commandTraverseSetting :: Applicative f => (forall a. () => Setting a -> f (Setting a)) -> Command s -> f (Command s)
- OptEnvConf.Parser: parserMapSetting :: (forall a. Setting a -> Setting a) -> Parser s -> Parser s
+ OptEnvConf.Parser: parserMapSetting :: (forall a. () => Setting a -> Setting a) -> Parser s -> Parser s
- OptEnvConf.Parser: parserTraverseSetting :: forall f s. Applicative f => (forall a. Setting a -> f (Setting a)) -> Parser s -> f (Parser s)
+ OptEnvConf.Parser: parserTraverseSetting :: Applicative f => (forall a. () => Setting a -> f (Setting a)) -> Parser s -> f (Parser s)
- OptEnvConf.Parser: strArgument :: HasCallStack => IsString string => [Builder string] -> Parser string
+ OptEnvConf.Parser: strArgument :: (HasCallStack, IsString string) => [Builder string] -> Parser string
- OptEnvConf.Parser: strOption :: HasCallStack => IsString string => [Builder string] -> Parser string
+ OptEnvConf.Parser: strOption :: (HasCallStack, IsString string) => [Builder string] -> Parser string
- OptEnvConf.Parser: subSettings :: HasCallStack => HasParser a => String -> Parser a
+ OptEnvConf.Parser: subSettings :: (HasCallStack, HasParser a) => String -> Parser a
- OptEnvConf.Setting: BuildAddEnv :: !String -> BuildInstruction a
+ OptEnvConf.Setting: BuildAddEnv :: !EnvVarSetting -> BuildInstruction a
- OptEnvConf.Setting: ConfigValSetting :: !NonEmpty String -> !ValueCodec void (Maybe a) -> ConfigValSetting a
+ OptEnvConf.Setting: ConfigValSetting :: !NonEmpty String -> !Bool -> !ValueCodec void (Maybe a) -> ConfigValSetting a
- OptEnvConf.Setting: Setting :: ![Dashed] -> ![Reader a] -> !Bool -> !Maybe a -> !Bool -> !Maybe (NonEmpty String) -> !Maybe (NonEmpty (ConfigValSetting a)) -> !Maybe (a, String) -> ![String] -> !Bool -> !Maybe Metavar -> !Maybe String -> !Maybe Completer -> Setting a
+ OptEnvConf.Setting: Setting :: ![Dashed] -> ![Reader a] -> !Bool -> !Maybe a -> !Bool -> !Maybe (NonEmpty EnvVarSetting) -> !Maybe (NonEmpty (ConfigValSetting a)) -> !Maybe (a, String) -> ![String] -> !Bool -> !Maybe Metavar -> !Maybe String -> !Maybe Completer -> Setting a
- OptEnvConf.Setting: [settingEnvVars] :: Setting a -> !Maybe (NonEmpty String)
+ OptEnvConf.Setting: [settingEnvVars] :: Setting a -> !Maybe (NonEmpty EnvVarSetting)
- OptEnvConf.Validation: ValidationT :: m (Validation e a) -> ValidationT e m a
+ OptEnvConf.Validation: ValidationT :: m (Validation e a) -> ValidationT e (m :: Type -> Type) a
- OptEnvConf.Validation: [unValidationT] :: ValidationT e m a -> m (Validation e a)
+ OptEnvConf.Validation: [unValidationT] :: ValidationT e (m :: Type -> Type) a -> m (Validation e a)
- OptEnvConf.Validation: mapValidationTFailure :: Functor m => (e1 -> e2) -> ValidationT e1 m a -> ValidationT e2 m a
+ OptEnvConf.Validation: mapValidationTFailure :: forall (m :: Type -> Type) e1 e2 a. Functor m => (e1 -> e2) -> ValidationT e1 m a -> ValidationT e2 m a
- OptEnvConf.Validation: newtype ValidationT e m a
+ OptEnvConf.Validation: newtype ValidationT e (m :: Type -> Type) a
- OptEnvConf.Validation: validationTFailure :: Applicative m => e -> ValidationT e m a
+ OptEnvConf.Validation: validationTFailure :: forall (m :: Type -> Type) e a. Applicative m => e -> ValidationT e m a
Files
- CHANGELOG.md +10/−0
- opt-env-conf.cabal +1/−1
- src/OptEnvConf.hs +4/−0
- src/OptEnvConf/Doc.hs +1/−1
- src/OptEnvConf/Parser.hs +5/−2
- src/OptEnvConf/Run.hs +1/−1
- src/OptEnvConf/Setting.hs +65/−5
CHANGELOG.md view
@@ -1,5 +1,15 @@ # Changelog +## [0.10.0.0] - 2025-09-17++This is technically a breaking change, but if you don't use any `opt-env-conf`+internals, nothing should break for you.++### Added++* `unprefixedEnv`+* `unprefixedConf`+ ## [0.9.0.0] - 2025-03-12 ### Added
opt-env-conf.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: opt-env-conf-version: 0.9.0.0+version: 0.10.0.0 synopsis: Settings parsing for Haskell: command-line arguments, environment variables, and configuration values. homepage: https://github.com/NorfairKing/opt-env-conf#readme bug-reports: https://github.com/NorfairKing/opt-env-conf/issues
src/OptEnvConf.hs view
@@ -25,9 +25,13 @@ long, short, env,+ unprefixedEnv, conf, confWith, confWith',+ unprefixedConf,+ unprefixedConfWith,+ unprefixedConfWith', name, value, hidden,
src/OptEnvConf/Doc.hs view
@@ -195,7 +195,7 @@ let setDocTryArgument = settingTryArgument let setDocTrySwitch = isJust settingSwitchValue let setDocTryOption = settingTryOption- let setDocEnvVars = settingEnvVars+ let setDocEnvVars = NE.map envVarSettingVar <$> settingEnvVars let setDocConfKeys = NE.map ( \ConfigValSetting {..} ->
src/OptEnvConf/Parser.hs view
@@ -1014,7 +1014,10 @@ BuildTryOption -> Nothing BuildAddShort _ -> Nothing BuildAddLong _ -> Nothing- BuildAddEnv e -> Just $ BuildAddEnv $ e ++ "_FILE"+ BuildAddEnv e ->+ Just $+ BuildAddEnv $+ suffixEnvVarSetting "_FILE" e BuildAddConf _ -> Nothing BuildSetDefault _ _ -> Nothing i -> Just i@@ -1053,7 +1056,7 @@ {-# ANN subEnv ("NOCOVER" :: String) #-} subEnv :: String -> Parser a -> Parser a subEnv prefix = parserMapSetting $ \s ->- s {settingEnvVars = NE.map (prefix <>) <$> settingEnvVars s}+ s {settingEnvVars = NE.map (prefixEnvVarSetting prefix) <$> settingEnvVars s} -- | Helper function for calling 'subEnv' with 'toEnvCase' and a @'_'@ appended. --
src/OptEnvConf/Run.hs view
@@ -574,7 +574,7 @@ -- always fails if it's missing a reader. rs <- requireReaders settingReaders es <- asks ppEnvEnv- let founds = mapMaybe (`EnvMap.lookup` es) (NE.toList ne)+ let founds = mapMaybe ((`EnvMap.lookup` es) . envVarSettingVar) (NE.toList ne) -- Run the parser on all specified env vars before -- returning the first because we want to fail if any -- of them fail, even if they wouldn't be the parse
src/OptEnvConf/Setting.hs view
@@ -6,6 +6,7 @@ module OptEnvConf.Setting ( Setting (..),+ EnvVarSetting (..), ConfigValSetting (..), -- * Builders@@ -20,9 +21,13 @@ long, short, env,+ unprefixedEnv, conf, confWith, confWith',+ unprefixedConf,+ unprefixedConfWith,+ unprefixedConfWith', name, value, valueWithShown,@@ -42,6 +47,8 @@ emptySetting, Metavar, Help,+ prefixEnvVarSetting,+ suffixEnvVarSetting, prefixConfigValSetting, suffixConfigValSettingKey, )@@ -80,7 +87,7 @@ -- options. settingTryOption :: !Bool, -- | Which env vars can be read.- settingEnvVars :: !(Maybe (NonEmpty String)),+ settingEnvVars :: !(Maybe (NonEmpty EnvVarSetting)), -- | Which and how to parse config values settingConfigVals :: !(Maybe (NonEmpty (ConfigValSetting a))), -- | Default value, if none of the above find the setting.@@ -115,14 +122,39 @@ `hashWithSalt` (snd <$> settingDefaultValue) ) +data EnvVarSetting = EnvVarSetting+ { envVarSettingVar :: !String,+ envVarSettingAllowPrefix :: !Bool+ }+ deriving (Show, Eq)++instance Hashable EnvVarSetting where+ hashWithSalt salt EnvVarSetting {..} =+ salt+ `hashWithSalt` envVarSettingVar+ `hashWithSalt` envVarSettingAllowPrefix++prefixEnvVarSetting :: String -> EnvVarSetting -> EnvVarSetting+prefixEnvVarSetting prefix e =+ if envVarSettingAllowPrefix e+ then e {envVarSettingVar = prefix <> envVarSettingVar e}+ else e++suffixEnvVarSetting :: String -> EnvVarSetting -> EnvVarSetting+suffixEnvVarSetting suffix e = e {envVarSettingVar = envVarSettingVar e <> suffix}+ data ConfigValSetting a = forall void. ConfigValSetting { configValSettingPath :: !(NonEmpty String),+ configValSettingAllowPrefix :: !Bool, configValSettingCodec :: !(ValueCodec void (Maybe a)) } prefixConfigValSetting :: String -> ConfigValSetting a -> ConfigValSetting a-prefixConfigValSetting prefix c = c {configValSettingPath = prefix NE.<| configValSettingPath c}+prefixConfigValSetting prefix c =+ if configValSettingAllowPrefix c+ then c {configValSettingPath = prefix NE.<| configValSettingPath c}+ else c suffixConfigValSettingKey :: String -> ConfigValSetting a -> ConfigValSetting a suffixConfigValSettingKey suffix c = c {configValSettingPath = suffixPath $ configValSettingPath c}@@ -206,7 +238,7 @@ | BuildAddReader !(Reader a) | BuildAddLong !(NonEmpty Char) | BuildAddShort !Char- | BuildAddEnv !String+ | BuildAddEnv !EnvVarSetting | BuildAddConf !(ConfigValSetting a) | BuildSetDefault !a !String | BuildAddExample !String@@ -318,8 +350,12 @@ -- -- Multiple 'env's will be tried in order. env :: String -> Builder a-env v = Builder [BuildAddEnv v]+env v = Builder [BuildAddEnv (EnvVarSetting v True)] +-- | Like 'env' but ignores any 'subEnv', 'subEnv_', or 'subAll'.+unprefixedEnv :: String -> Builder a+unprefixedEnv v = Builder [BuildAddEnv (EnvVarSetting v False)]+ -- | Try to parse a configuration value at the given key. -- -- Multiple 'conf's will be tried in order.@@ -333,7 +369,31 @@ -- | Like 'confWith' but allows interpreting 'Null' as a value other than "Not found". confWith' :: String -> ValueCodec void (Maybe a) -> Builder a confWith' k c =- let t = ConfigValSetting {configValSettingPath = k :| [], configValSettingCodec = c}+ let t =+ ConfigValSetting+ { configValSettingPath = k :| [],+ configValSettingAllowPrefix = True,+ configValSettingCodec = c+ }+ in Builder [BuildAddConf t]++-- | Like 'conf' but ignores any 'subConf', 'subConf_', or 'subAll'.+unprefixedConf :: (HasCodec a) => String -> Builder a+unprefixedConf k = unprefixedConfWith k codec++-- | Like 'confWith' but ignores any 'subConf', 'subConf_', or 'subAll'.+unprefixedConfWith :: String -> ValueCodec void a -> Builder a+unprefixedConfWith k c = unprefixedConfWith' k (maybeCodec c)++-- | Like 'confWith'' but ignores any 'subConf', 'subConf_', or 'subAll'.+unprefixedConfWith' :: String -> ValueCodec void (Maybe a) -> Builder a+unprefixedConfWith' k c =+ let t =+ ConfigValSetting+ { configValSettingPath = k :| [],+ configValSettingAllowPrefix = False,+ configValSettingCodec = c+ } in Builder [BuildAddConf t] -- | Short-hand function for 'option', 'long', 'env', and 'conf' at the same time.