flags-applicative 0.0.4.3 → 0.0.4.4
raw patch · 3 files changed
+34/−3 lines, 3 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Flags.Applicative: UnexpectedFlagValue :: Name -> FlagError
Files
- flags-applicative.cabal +1/−1
- src/Flags/Applicative.hs +7/−2
- test/Spec.hs +26/−0
flags-applicative.cabal view
@@ -1,5 +1,5 @@ name: flags-applicative-version: 0.0.4.3+version: 0.0.4.4 synopsis: Applicative flag parsing description: https://github.com/mtth/flags-applicative homepage: https://github.com/mtth/flags-applicative
src/Flags/Applicative.hs view
@@ -220,6 +220,8 @@ | MissingFlagValue Name -- | A flag with a reserved name was declared. | ReservedFlag Name+ -- | A nullary flag was given a value.+ | UnexpectedFlagValue Name -- | At least one flag was set but unused. This can happen when optional flags are set but their -- branch is not selected. | UnexpectedFlags (NonEmpty Name)@@ -238,6 +240,7 @@ displayFlagError (MissingFlag name) = qualify name <> " is required but was not set" displayFlagError (MissingFlagValue name) = "missing value for " <> qualify name displayFlagError (ReservedFlag name) = qualify name <> " was declared but is reserved"+displayFlagError (UnexpectedFlagValue name) = "unexpected value for " <> qualify name displayFlagError (UnexpectedFlags names) = "unexpected " <> (T.intercalate " " $ fmap qualify $ toList $ names) displayFlagError (UnknownFlag name) = "undeclared " <> qualify name@@ -323,7 +326,9 @@ Nothing -> if ignoreUnknown then second (token:) <$> go tokens else Left (UnknownFlag name)- Just (Flag Nullary _) -> insert "" tokens+ Just (Flag Nullary _) -> if T.null pval+ then insert "" tokens+ else Left $ UnexpectedFlagValue name Just (Flag Unary _) -> case T.uncons pval of Nothing -> case tokens of (token':tokens') -> if prefix `isPrefixOf` token'@@ -373,7 +378,7 @@ flags'' = foldl' (\m name -> Map.insert name (Flag Nullary "") m) flags' sswitches Right (action, flags'') (rv, unused, tokens'') <- runAction False action flags tokens'- case Set.minView unused of+ case Set.minView $ Set.difference unused (sflags <> sswitches) of Nothing -> Right (rv, tokens'') Just (name, names) -> Left $ UnexpectedFlags $ name :| toList names
test/Spec.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE TypeApplications #-} import Control.Applicative ((<|>))+import Data.Either (isLeft) import Data.List.NonEmpty (NonEmpty(..)) import Flags.Applicative import Test.Hspec@@ -20,6 +21,11 @@ parser = (,) <$> textFlag "foo" "" <*> textFlag "foo" "" res = parseFlags parser [] res `shouldBe` Left (DuplicateFlag "foo")+ it "should support help" $ do+ let+ parser = textFlag "foo" ""+ res = parseFlags parser ["--foo=abc", "hi", "--help"]+ isLeft res `shouldBe` True it "should fail on unknown flags" $ do let parser = textFlag "foo" ""@@ -55,3 +61,23 @@ parser = textListFlag "," "bar" "" res = parseFlags parser ["--bar=a,b,c", "def"] res `shouldBe` Right (["a", "b", "c"], ["def"])+ it "should swallow switches" $ do+ let+ parser = boolFlag "foo" ""+ res = parseFlags parser ["--foo", "--bar", "--swallowed_switches=bar"]+ res `shouldBe` Right (True, [])+ it "should fail when a switch is set as a flag" $ do+ let+ parser = boolFlag "foo" ""+ res = parseFlags parser ["--foo=3"]+ res `shouldBe` Left (UnexpectedFlagValue "foo")+ it "should swallow flags" $ do+ let+ parser = boolFlag "foo" ""+ res = parseFlags parser ["--bar=2", "--swallowed_flags=bar"]+ res `shouldBe` Right (False, [])+ it "should fail when a flag is swallowed as a switch" $ do+ let+ parser = boolFlag "foo" ""+ res = parseFlags parser ["--foo", "--bar=1", "--swallowed_switches=bar"]+ res `shouldBe` Left (UnexpectedFlagValue "bar")