opt-env-conf 0.10.0.0 → 0.11.0.0
raw patch · 8 files changed
+55/−35 lines, 8 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- OptEnvConf: someNonEmpty :: Parser a -> Parser (NonEmpty a)
+ OptEnvConf: someNonEmpty :: HasCallStack => Parser a -> Parser (NonEmpty a)
- OptEnvConf.Parser: [ParserMany] :: forall a1. !Parser a1 -> Parser [a1]
+ OptEnvConf.Parser: [ParserMany] :: forall a1. !Maybe SrcLoc -> !Parser a1 -> Parser [a1]
- OptEnvConf.Parser: [ParserSome] :: forall a1. !Parser a1 -> Parser (NonEmpty a1)
+ OptEnvConf.Parser: [ParserSome] :: forall a1. !Maybe SrcLoc -> !Parser a1 -> Parser (NonEmpty a1)
- OptEnvConf.Parser: someNonEmpty :: Parser a -> Parser (NonEmpty a)
+ OptEnvConf.Parser: someNonEmpty :: HasCallStack => Parser a -> Parser (NonEmpty a)
Files
- CHANGELOG.md +12/−0
- opt-env-conf.cabal +1/−1
- src/OptEnvConf/Completion.hs +2/−2
- src/OptEnvConf/Doc.hs +2/−2
- src/OptEnvConf/Lint.hs +4/−4
- src/OptEnvConf/Nix.hs +2/−2
- src/OptEnvConf/Parser.hs +22/−14
- src/OptEnvConf/Run.hs +10/−10
CHANGELOG.md view
@@ -1,5 +1,17 @@ # Changelog +## [0.11.0.0] - 2025-09-29++This is technically a breaking change, but if you don't use any `opt-env-conf`+internals, nothing should break for you.++### Changed++* `ParserMany` and `ParserSome` can now carry source locations.+ This is not likely to happen often because the `Alternative` class does not+ have a `HasCallStack` super class, but could still happen when using+ `someNonEmpty`.+ ## [0.10.0.0] - 2025-09-17 This is technically a breaking change, but if you don't use any `opt-env-conf`
opt-env-conf.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: opt-env-conf-version: 0.10.0.0+version: 0.11.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/Completion.hs view
@@ -273,12 +273,12 @@ ParserAlt p1 p2 -> orCompletions p1 p2 ParserSelect p1 p2 -> andCompletions p1 p2 ParserEmpty _ -> pure Nothing- ParserMany p -> do+ ParserMany _ p -> do mR <- go p case mR of Nothing -> pure Nothing Just os -> fmap (os ++) <$> go p- ParserSome p -> do+ ParserSome _ p -> do mR <- go p case mR of Nothing -> pure Nothing
src/OptEnvConf/Doc.hs view
@@ -169,8 +169,8 @@ ParserSelect p1 p2 -> AnyDocsAnd [go p1, go p2] ParserEmpty _ -> AnyDocsOr [] ParserAlt p1 p2 -> AnyDocsOr [go p1, go p2]- ParserMany p -> AnyDocsOr [go p, AnyDocsSingle Nothing]- ParserSome p -> AnyDocsAnd [go p, go (ParserMany p)] -- TODO: is this right?+ ParserMany _ p -> AnyDocsOr [go p, AnyDocsSingle Nothing]+ ParserSome mLoc p -> AnyDocsAnd [go p, go (ParserMany mLoc p)] -- TODO: is this right? ParserAllOrNothing _ p -> go p ParserCheck _ _ _ p -> go p ParserCommands _ mDefault cs -> AnyDocsCommands mDefault $ map commandParserDocs cs
src/OptEnvConf/Lint.hs view
@@ -258,16 +258,16 @@ c2 <- go p2 pure (c1 && c2) -- TODO: is this right? -- TODO lint if we don't try to parse anything consuming under many.- ParserMany p -> do+ ParserMany mLoc p -> do c <- go p when (not c) $- mapValidationTFailure (LintError Nothing) $+ mapValidationTFailure (LintError mLoc) $ validationTFailure LintErrorManyInfinite pure c- ParserSome p -> do+ ParserSome mLoc p -> do c <- go p when (not c) $- mapValidationTFailure (LintError Nothing) $+ mapValidationTFailure (LintError mLoc) $ validationTFailure LintErrorManyInfinite pure c ParserAllOrNothing _ p -> go p
src/OptEnvConf/Nix.hs view
@@ -36,8 +36,8 @@ ParserSelect p1 p2 -> M.unionWith combineOption (go p1) (go p2) ParserEmpty _ -> M.empty ParserAlt p1 p2 -> M.unionWith combineOption (go p1) (go p2) -- TODO is this right?- ParserMany p -> go p- ParserSome p -> go p+ ParserMany _ p -> go p+ ParserSome _ p -> go p ParserAllOrNothing _ p -> go p ParserCheck _ _ _ p -> go p ParserCommands _ _ cs -> M.unionsWith combineOption $ map goCommand cs
src/OptEnvConf/Parser.hs view
@@ -175,9 +175,11 @@ !(Parser a) -> Parser a ParserMany ::+ !(Maybe SrcLoc) -> !(Parser a) -> Parser [a] ParserSome ::+ !(Maybe SrcLoc) -> !(Parser a) -> Parser (NonEmpty a) ParserAllOrNothing ::@@ -245,8 +247,8 @@ ParserSelect pe pf -> isEmpty pe && isEmpty pf ParserEmpty _ -> True ParserAlt _ _ -> False- ParserMany p -> isEmpty p- ParserSome p -> isEmpty p+ ParserMany _ p -> isEmpty p+ ParserSome _ p -> isEmpty p ParserAllOrNothing _ p -> isEmpty p ParserCheck _ _ _ p -> isEmpty p ParserCommands _ _ cs -> null cs@@ -278,8 +280,8 @@ ParserCommands (mLoc1 <|> mLoc2) (mDefault1 <|> mDefault2) (cs1 ++ cs2) _ -> ParserAlt p1' p2' in go p1 p2- many = ParserMany- some = fmap NE.toList . ParserSome+ many = ParserMany Nothing+ some = fmap NE.toList . ParserSome Nothing showParserABit :: Parser a -> String showParserABit = ($ "") . showParserPrec 0@@ -311,13 +313,17 @@ . go 11 p1 . showString " " . go 11 p2- ParserMany p ->+ ParserMany mLoc p -> showParen (d > 10) $ showString "Many "+ . showsPrec 11 mLoc+ . showString " " . go 11 p- ParserSome p ->+ ParserSome mLoc p -> showParen (d > 10) $ showString "Some "+ . showsPrec 11 mLoc+ . showString " " . go 11 p ParserAllOrNothing mLoc p -> showParen (d > 10) $@@ -507,8 +513,10 @@ argument : reader str : metavar "STR" : builders -- | Like 'some' but with a more accurate type-someNonEmpty :: Parser a -> Parser (NonEmpty a)-someNonEmpty = ParserSome+someNonEmpty :: (HasCallStack) => Parser a -> Parser (NonEmpty a)+someNonEmpty = ParserSome mLoc+ where+ mLoc = snd <$> listToMaybe (getCallStack callStack) -- | Give a parser a default value. --@@ -1106,8 +1114,8 @@ ParserSelect p1 p2 -> ParserSelect (go p1) (go p2) ParserEmpty _ -> ParserEmpty Nothing ParserAlt p1 p2 -> ParserAlt (go p1) (go p2)- ParserMany p -> ParserMany (go p)- ParserSome p -> ParserSome (go p)+ ParserMany _ p -> ParserMany Nothing (go p)+ ParserSome _ p -> ParserSome Nothing (go p) ParserAllOrNothing _ p -> ParserAllOrNothing Nothing (go p) ParserCheck _ forgivable f p -> ParserCheck Nothing forgivable f (go p) ParserCommands _ mDefault cs -> ParserCommands Nothing mDefault $ map commandEraseSrcLocs cs@@ -1143,8 +1151,8 @@ ParserSelect p1 p2 -> ParserSelect <$> go p1 <*> go p2 ParserEmpty mLoc -> pure $ ParserEmpty mLoc ParserAlt p1 p2 -> ParserAlt <$> go p1 <*> go p2- ParserMany p -> ParserMany <$> go p- ParserSome p -> ParserSome <$> go p+ ParserMany mLoc p -> ParserMany mLoc <$> go p+ ParserSome mLoc p -> ParserSome mLoc <$> go p ParserAllOrNothing mLoc p -> ParserAllOrNothing mLoc <$> go p ParserCheck mLoc forgivable f p -> ParserCheck mLoc forgivable f <$> go p ParserCommands mLoc mDefault cs -> ParserCommands mLoc mDefault <$> traverse (commandTraverseSetting func) cs@@ -1172,8 +1180,8 @@ ParserSelect p1 p2 -> M.union (go p1) (go p2) ParserEmpty _ -> M.empty ParserAlt p1 p2 -> M.union (go p1) (go p2)- ParserMany p -> go p- ParserSome p -> go p+ ParserMany _ p -> go p+ ParserSome _ p -> go p ParserAllOrNothing _ p -> go p -- TODO is this right? ParserCheck _ _ _ p -> go p ParserCommands _ _ cs -> M.unions $ map (go . commandParser) cs
src/OptEnvConf/Run.hs view
@@ -381,21 +381,21 @@ Nothing -> do debug ["Left side failed, trying right side."] ppIndent $ go p2- ParserMany p' -> do- debug [syntaxChunk "Many"]+ ParserMany mLoc p' -> do+ debug [syntaxChunk "Many", ": ", mSrcLocChunk mLoc] ppIndent $ do eor <- tryPP $ go p' case eor of Nothing -> pure [] Just a -> do- as <- go (ParserMany p')+ as <- go (ParserMany mLoc p') pure (a : as)- ParserSome p' -> do- debug [syntaxChunk "Some"]+ ParserSome mLoc p' -> do+ debug [syntaxChunk "Some", ": ", mSrcLocChunk mLoc] ppIndent $ do a <- go p' debug ["First element of some succeeded, continuing with Many"]- as <- go (ParserMany p')+ as <- go (ParserMany mLoc p') pure (a :| as) ParserAllOrNothing mLoc p' -> do debug [syntaxChunk "AllOrNothing", ": ", mSrcLocChunk mLoc]@@ -769,11 +769,11 @@ Nothing -> do debug ["Left side failed, trying right side."] ppIndent $ go p2- ParserMany p' -> do- debug [syntaxChunk "Many"]+ ParserMany mLoc p' -> do+ debug [syntaxChunk "Many", ": ", mSrcLocChunk mLoc] ppIndent $ go p'- ParserSome p' -> do- debug [syntaxChunk "Some"]+ ParserSome mLoc p' -> do+ debug [syntaxChunk "Some", ": ", mSrcLocChunk mLoc] ppIndent $ go p' ParserAllOrNothing mLoc p' -> do debug [syntaxChunk "AllOrNothing", ": ", mSrcLocChunk mLoc]