packages feed

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 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.