Class for parsing with parsec. Mainly used for .cabal file fields.
For parsing .cabal like file structure, see Distribution.Fields.
Methods
parsec :: CabalParsing m => m a
Instances78FieldGrammar, Parsec, …
Parsec OpenModuleDefined in Cabal-syntax-3.12.1.0 · Distribution.BackpackExample1 expression eitherParsec "Includes2-0.1.0.0-inplace-mysql:Database.MySQL" :: Either String OpenModuleRight (OpenModule (DefiniteUnitId (DefUnitId {unDefUnitId = UnitId "Includes2-0.1.0.0-inplace-mysql"})) (ModuleName "Database.MySQL"))
Parsec OpenUnitIdDefined in Cabal-syntax-3.12.1.0 · Distribution.BackpackExample1 expression eitherParsec "foobar" :: Either String OpenUnitIdRight (DefiniteUnitId (DefUnitId {unDefUnitId = UnitId "foobar"}))
Example1 expression eitherParsec "foo[Str=text-1.2.3:Data.Text.Text]" :: Either String OpenUnitIdRight (IndefFullUnitId (ComponentId "foo") (fromList [(ModuleName "Str",OpenModule (DefiniteUnitId (DefUnitId {unDefUnitId = UnitId "text-1.2.3"})) (ModuleName "Data.Text.Text"))]))
Parsec AbiTagDefined in Cabal-syntax-3.12.1.0 · Distribution.CompilerParsec CompilerFlavorDefined in Cabal-syntax-3.12.1.0 · Distribution.CompilerParsec CompilerIdDefined in Cabal-syntax-3.12.1.0 · Distribution.CompilerParsec FilePathNTDefined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.NewtypesParsec SpecLicenseDefined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.NewtypesParsec SpecVersionDefined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.NewtypesParsec TestedWithDefined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.NewtypesParsec TokenDefined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.NewtypesParsec Token'Defined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.NewtypesParsec LicenseDefined in Cabal-syntax-3.12.1.0 · Distribution.LicenseParsec ModuleNameDefined in Cabal-syntax-3.12.1.0 · Distribution.ModuleNameParsec CompatFilePathDefined in Cabal-syntax-3.12.1.0 · Distribution.PackageDescription.FieldGrammarParsec CompatLicenseFileDefined in Cabal-syntax-3.12.1.0 · Distribution.PackageDescription.FieldGrammarParsec LicenseDefined in Cabal-syntax-3.12.1.0 · Distribution.SPDX.LicenseExample1 expression eitherParsec "BSD-3-Clause AND MIT" :: Either String LicenseRight (License (EAnd (ELicense (ELicenseId BSD_3_Clause) Nothing) (ELicense (ELicenseId MIT) Nothing)))
Example1 expression eitherParsec "NONE" :: Either String LicenseRight NONE
Parsec LicenseExceptionIdDefined in Cabal-syntax-3.12.1.0 · Distribution.SPDX.LicenseExceptionIdParsec LicenseExpressionDefined in Cabal-syntax-3.12.1.0 · Distribution.SPDX.LicenseExpressionParsec SimpleLicenseExpressionDefined in Cabal-syntax-3.12.1.0 · Distribution.SPDX.LicenseExpressionParsec LicenseIdDefined in Cabal-syntax-3.12.1.0 · Distribution.SPDX.LicenseIdExample1 expression eitherParsec "BSD-3-Clause" :: Either String LicenseIdRight BSD_3_Clause
Example1 expression eitherParsec "BSD3" :: Either String LicenseIdLeft "...Unknown SPDX license identifier: 'BSD3' Do you mean BSD-3-Clause?"
Parsec LicenseRefDefined in Cabal-syntax-3.12.1.0 · Distribution.SPDX.LicenseReferenceParsec ArchDefined in Cabal-syntax-3.12.1.0 · Distribution.SystemParsec OSDefined in Cabal-syntax-3.12.1.0 · Distribution.SystemParsec PlatformDefined in Cabal-syntax-3.12.1.0 · Distribution.SystemParsec AbiDependencyDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.AbiDependencyParsec AbiHashDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.AbiHashParsec BenchmarkTypeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.BenchmarkTypeParsec BuildTypeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.BuildTypeParsec ComponentIdDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ComponentIdParsec ComponentNameDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ComponentNameParsec DependencyDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.DependencyExample1 expression simpleParsec "mylib:sub" :: Maybe DependencyJust (Dependency (PackageName "mylib") (OrLaterVersion (mkVersion [0])) (fromNonEmpty (LSubLibName (UnqualComponentName "sub") :| [])))
Example1 expression simpleParsec "mylib:{sub1,sub2}" :: Maybe DependencyJust (Dependency (PackageName "mylib") (OrLaterVersion (mkVersion [0])) (fromNonEmpty (LSubLibName (UnqualComponentName "sub1") :| [LSubLibName (UnqualComponentName "sub2")])))
Example1 expression simpleParsec "mylib:{ sub1 , sub2 }" :: Maybe DependencyJust (Dependency (PackageName "mylib") (OrLaterVersion (mkVersion [0])) (fromNonEmpty (LSubLibName (UnqualComponentName "sub1") :| [LSubLibName (UnqualComponentName "sub2")])))
Example1 expression simpleParsec "mylib:{ sub1 , sub2 } ^>= 42" :: Maybe DependencyJust (Dependency (PackageName "mylib") (MajorBoundVersion (mkVersion [42])) (fromNonEmpty (LSubLibName (UnqualComponentName "sub1") :| [LSubLibName (UnqualComponentName "sub2")])))
Example1 expression simpleParsec "mylib:{ } ^>= 42" :: Maybe DependencyNothing
Example1 expression traverse_ print (map simpleParsec ["mylib:mylib", "mylib:{mylib}", "mylib:{mylib,sublib}" ] :: [Maybe Dependency])Just (Dependency (PackageName "mylib") (OrLaterVersion (mkVersion [0])) (fromNonEmpty (LMainLibName :| [])))Just (Dependency (PackageName "mylib") (OrLaterVersion (mkVersion [0])) (fromNonEmpty (LMainLibName :| [])))Just (Dependency (PackageName "mylib") (OrLaterVersion (mkVersion [0])) (fromNonEmpty (LMainLibName :| [LSubLibName (UnqualComponentName "sublib")])))
Spaces around colon are not allowed:
Example1 expression map simpleParsec ["mylib: sub", "mylib :sub", "mylib: {sub1,sub2}", "mylib :{sub1,sub2}"] :: [Maybe Dependency][Nothing,Nothing,Nothing,Nothing]
Sublibrary syntax is accepted since
cabal-version: 3.0Example1 expression map (`simpleParsec'` "mylib:sub") [CabalSpecV2_4, CabalSpecV3_0] :: [Maybe Dependency][Nothing,Just (Dependency (PackageName "mylib") (OrLaterVersion (mkVersion [0])) (fromNonEmpty (LSubLibName (UnqualComponentName "sub") :| [])))]
Parsec ExeDependencyDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ExeDependencyExamples
Example1 expression simpleParsec "happy:happy" :: Maybe ExeDependencyJust (ExeDependency (PackageName "happy") (UnqualComponentName "happy") (OrLaterVersion (mkVersion [0])))
Example1 expression simpleParsec "happy:happy >= 1.19.12" :: Maybe ExeDependencyJust (ExeDependency (PackageName "happy") (UnqualComponentName "happy") (OrLaterVersion (mkVersion [1,19,12])))
Example1 expression simpleParsec "happy:happy>=1.19.12" :: Maybe ExeDependencyJust (ExeDependency (PackageName "happy") (UnqualComponentName "happy") (OrLaterVersion (mkVersion [1,19,12])))
Example1 expression simpleParsec "happy : happy >= 1.19.12" :: Maybe ExeDependencyNothing
Example1 expression simpleParsec "happy: happy >= 1.19.12" :: Maybe ExeDependencyNothing
Example1 expression simpleParsec "happy :happy >= 1.19.12" :: Maybe ExeDependencyNothing
Parsec ExecutableScopeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ExecutableScopeParsec ExposedModuleDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ExposedModuleParsec FlagAssignmentDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.FlagExample1 expression simpleParsec "" :: Maybe FlagAssignmentJust (fromList [])
Example1 expression simpleParsec "+foo -bar" :: Maybe FlagAssignmentJust (fromList [(FlagName "bar",(1,False)),(FlagName "foo",(1,True))])
Example1 expression simpleParsec "-none -any" :: Maybe FlagAssignmentJust (fromList [(FlagName "any",(1,False)),(FlagName "none",(1,False))])
Example1 expression simpleParsec "+foo -foo +foo +foo" :: Maybe FlagAssignmentJust (fromList [(FlagName "foo",(4,True))])
Example1 expression simpleParsec "+foo -bar baz" :: Maybe FlagAssignmentNothing
Issue #7279 was fixed in Cabal-3.8
Example1 expression explicitEitherParsec (parsecCommaList parsec) "+foo , -bar" :: Either String [FlagAssignment]Right [fromList [(FlagName "foo",(1,True))],fromList [(FlagName "bar",(1,False))]]
Example1 expression explicitEitherParsec (parsecCommaList parsecFlagAssignmentNonEmpty) "+foo , -bar" :: Either String [FlagAssignment]Right [fromList [(FlagName "foo",(1,True))],fromList [(FlagName "bar",(1,False))]]
Example1 expression simpleParsec "+foo+foo" :: Maybe FlagAssignmentNothing
Parsec FlagNameDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.FlagParsec LibVersionInfoDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ForeignLibParsec ForeignLibOptionDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ForeignLibOptionParsec ForeignLibTypeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ForeignLibTypeParsec IncludeRenamingDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.IncludeRenamingParsec CompatPackageKeyDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.InstalledPackageInfo.FieldGrammarParsec ExposedModulesDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.InstalledPackageInfo.FieldGrammarParsec InstWithDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.InstalledPackageInfo.FieldGrammarParsec SpecLicenseLenientDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.InstalledPackageInfo.FieldGrammarParsec LegacyExeDependencyDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.LegacyExeDependencyParsec LibraryVisibilityDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.LibraryVisibilityParsec MixinDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.MixinExample1 expression simpleParsec "mylib" :: Maybe MixinJust (Mixin {mixinPackageName = PackageName "mylib", mixinLibraryName = LMainLibName, mixinIncludeRenaming = IncludeRenaming {includeProvidesRn = DefaultRenaming, includeRequiresRn = DefaultRenaming}})
Example1 expression simpleParsec "thatlib:sublib" :: Maybe MixinJust (Mixin {mixinPackageName = PackageName "thatlib", mixinLibraryName = LSubLibName (UnqualComponentName "sublib"), mixinIncludeRenaming = IncludeRenaming {includeProvidesRn = DefaultRenaming, includeRequiresRn = DefaultRenaming}})
Example1 expression simpleParsec "thatlib:thatlib" :: Maybe MixinJust (Mixin {mixinPackageName = PackageName "thatlib", mixinLibraryName = LMainLibName, mixinIncludeRenaming = IncludeRenaming {includeProvidesRn = DefaultRenaming, includeRequiresRn = DefaultRenaming}})
Sublibrary syntax is accepted since
cabal-version: 3.4.Example1 expression map (`simpleParsec'` "mylib:sub") [CabalSpecV3_0, CabalSpecV3_4] :: [Maybe Mixin][Nothing,Just (Mixin {mixinPackageName = PackageName "mylib", mixinLibraryName = LSubLibName (UnqualComponentName "sub"), mixinIncludeRenaming = IncludeRenaming {includeProvidesRn = DefaultRenaming, includeRequiresRn = DefaultRenaming}})]
Parsec ModuleDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ModuleParsec ModuleReexportDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ModuleReexportParsec ModuleRenamingDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.ModuleRenamingParsec MungedPackageIdDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.MungedPackageIdExample1 expression simpleParsec "foo-bar-0" :: Maybe MungedPackageIdJust (MungedPackageId {mungedName = MungedPackageName (PackageName "foo-bar") LMainLibName, mungedVersion = mkVersion [0]})
Example1 expression simpleParsec "foo-bar" :: Maybe MungedPackageIdJust (MungedPackageId {mungedName = MungedPackageName (PackageName "foo-bar") LMainLibName, mungedVersion = mkVersion []})
Example1 expression simpleParsec "z-foo-bar-z-baz-0" :: Maybe MungedPackageIdJust (MungedPackageId {mungedName = MungedPackageName (PackageName "foo-bar") (LSubLibName (UnqualComponentName "baz")), mungedVersion = mkVersion [0]})
Example1 expression simpleParsec "foo-bar-0-0" :: Maybe MungedPackageIdNothing
Example1 expression simpleParsec "foo-bar.0" :: Maybe MungedPackageIdNothing
Example1 expression simpleParsec "foo-bar.4-2" :: Maybe MungedPackageIdNothing
Parsec MungedPackageNameDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.MungedPackageNameExample1 expression simpleParsec "servant" :: Maybe MungedPackageNameJust (MungedPackageName (PackageName "servant") LMainLibName)
Example1 expression simpleParsec "z-servant-z-lackey" :: Maybe MungedPackageNameJust (MungedPackageName (PackageName "servant") (LSubLibName (UnqualComponentName "lackey")))
Example1 expression simpleParsec "z-servant-zz" :: Maybe MungedPackageNameJust (MungedPackageName (PackageName "z-servant-zz") LMainLibName)
Parsec PackageIdentifierDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.PackageIdExample1 expression simpleParsec "foo-bar-0" :: Maybe PackageIdentifierJust (PackageIdentifier {pkgName = PackageName "foo-bar", pkgVersion = mkVersion [0]})
Example1 expression simpleParsec "foo-bar" :: Maybe PackageIdentifierJust (PackageIdentifier {pkgName = PackageName "foo-bar", pkgVersion = mkVersion []})
Note: Stricter than
TextinstanceExample1 expression simpleParsec "foo-bar-0-0" :: Maybe PackageIdentifierNothing
Example1 expression simpleParsec "foo-bar.0" :: Maybe PackageIdentifierNothing
Example1 expression simpleParsec "foo-bar.4-2" :: Maybe PackageIdentifierNothing
Example1 expression simpleParsec "1.2.3" :: Maybe PackageIdentifierNothing
Parsec PackageNameDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.PackageNameParsec PackageVersionConstraintDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.PackageVersionConstraintExample1 expression simpleParsec "foo" :: Maybe PackageVersionConstraintJust (PackageVersionConstraint (PackageName "foo") (OrLaterVersion (mkVersion [0])))
Example1 expression simpleParsec "foo >=2.0" :: Maybe PackageVersionConstraintJust (PackageVersionConstraint (PackageName "foo") (OrLaterVersion (mkVersion [2,0])))
Example1 expression simpleParsec "foo-2.0" :: Maybe PackageVersionConstraintJust (PackageVersionConstraint (PackageName "foo") (ThisVersion (mkVersion [2,0])))
Parsec PkgconfigDependencyDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.PkgconfigDependencyParsec PkgconfigNameDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.PkgconfigNameParsec PkgconfigVersionDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.PkgconfigVersionExample1 expression simpleParsec "1.0.2n" :: Maybe PkgconfigVersionJust (PkgconfigVersion "1.0.2n")
Example1 expression simpleParsec "0.3.5+ds" :: Maybe PkgconfigVersionNothing
Parsec PkgconfigVersionRangeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.PkgconfigVersionRangeParsec KnownRepoTypeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.SourceRepoParsec RepoKindDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.SourceRepoParsec RepoTypeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.SourceRepoParsec TestTypeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.TestTypeParsec DefUnitIdDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.UnitIdParsec UnitIdDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.UnitIdThe textual format for UnitId coincides with the format GHC accepts for
-package-id.Parsec UnqualComponentNameDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.UnqualComponentNameParsec VersionDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.VersionParsec VersionRangeDefined in Cabal-syntax-3.12.1.0 · Distribution.Types.VersionRange.InternalExample1 expression simpleParsec "^>= 3.4" :: Maybe VersionRangeJust (MajorBoundVersion (mkVersion [3,4]))
Small history:
-anyand-noneremoved in 3.4 Use>=0and<0instead.Example1 expression map (`simpleParsec'` "-none") [CabalSpecV3_0, CabalSpecV3_4] :: [Maybe VersionRange][Just (EarlierVersion (mkVersion [0])),Nothing]
Set operations are introduced in 3.0
Example1 expression map (`simpleParsec'` "^>= { 1.2 , 1.3 }") [CabalSpecV2_4, CabalSpecV3_0] :: [Maybe VersionRange][Nothing,Just (UnionVersionRanges (MajorBoundVersion (mkVersion [1,2])) (MajorBoundVersion (mkVersion [1,3])))]
^>=is introduced in 2.0Example1 expression map (`simpleParsec'` "^>=1.2") [CabalSpecV1_24, CabalSpecV2_0] :: [Maybe VersionRange][Nothing,Just (MajorBoundVersion (mkVersion [1,2]))]
-noneis introduced in 1.22Example1 expression map (`simpleParsec'` "-none") [CabalSpecV1_20, CabalSpecV1_22] :: [Maybe VersionRange][Nothing,Just (EarlierVersion (mkVersion [0]))]
Operators are introduced in 1.8. Issues only a warning.
Example1 expression map (`simpleParsecW'` "== 1 || ==2") [CabalSpecV1_6, CabalSpecV1_8] :: [Maybe VersionRange][Nothing,Just (UnionVersionRanges (ThisVersion (mkVersion [1])) (ThisVersion (mkVersion [2])))]
Wild-version ranges are introduced in 1.6. Issues only a warning.
Example1 expression map (`simpleParsecW'` "== 1.2.*") [CabalSpecV1_4, CabalSpecV1_6] :: [Maybe VersionRange][Nothing,Just (IntersectVersionRanges (OrLaterVersion (mkVersion [1,2])) (EarlierVersion (mkVersion [1,3])))]
Parsec ExtensionDefined in Cabal-syntax-3.12.1.0 · Language.Haskell.ExtensionParsec LanguageDefined in Cabal-syntax-3.12.1.0 · Language.Haskell.ExtensionParsec BoolDefined in Cabal-syntax-3.12.1.0 · Distribution.ParsecFieldGrammar Parsec ParsecFieldGrammarDefined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.ParsecParsec a => Parsec (MQuoted a)Defined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.NewtypesParsec a => Parsec (Identity a)Defined in Cabal-syntax-3.12.1.0 · Distribution.ParsecParsec (SymbolicPath from to)Defined in Cabal-syntax-3.12.1.0 · Distribution.Utils.Path(Newtype a b, Sep sep, Parsec b) => Parsec (List sep b a)Defined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.Newtypes(Newtype a b, Sep sep, Parsec b) => Parsec (NonEmpty' sep b a)Defined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.Newtypes(Newtype a b, Ord a, Sep sep, Parsec b) => Parsec (Set' sep b a)Defined in Cabal-syntax-3.12.1.0 · Distribution.FieldGrammar.Newtypes