Distribution.Parsec.Class

Cabal-2.2.0.1: A framework for packaging Haskell software

Safe Haskell | None
Language | Haskell2010

Distribution.Parsec.Class

Contents

- CabalParsing & warnings
- Utilities

Synopsis

- class Parsec a where
- newtype ParsecParser a = PP {
  - unPP :: CabalSpecVersion -> Parsec FieldLineStream [PWarning] a
  }
- runParsecParser :: ParsecParser a -> FilePath -> FieldLineStream -> Either ParseError a
- simpleParsec :: Parsec a => String -> Maybe a
- lexemeParsec :: (CabalParsing m, Parsec a) => m a
- eitherParsec :: Parsec a => String -> Either String a
- explicitEitherParsec :: ParsecParser a -> String -> Either String a
- class (CharParsing m, MonadPlus m) => CabalParsing m where
- data PWarnType
  - = PWTOther
  - | PWTUTF
  - | PWTBoolCase
  - | PWTVersionTag
  - | PWTNewSyntax
  - | PWTOldSyntax
  - | PWTDeprecatedField
  - | PWTInvalidSubsection
  - | PWTUnknownField
  - | PWTUnknownSection
  - | PWTTrailingFields
  - | PWTExtraMainIs
  - | PWTExtraTestModule
  - | PWTExtraBenchmarkModule
  - | PWTLexNBSP
  - | PWTLexBOM
  - | PWTLexTab
  - | PWTQuirkyCabalFile
  - | PWTDoubleDash
  - | PWTMultipleSingularField
  - | PWTBuildTypeDefault
  - | PWTVersionLeadingZeros
- parsecToken :: CabalParsing m => m String
- parsecToken' :: CabalParsing m => m String
- parsecFilePath :: CabalParsing m => m FilePath
- parsecQuoted :: CabalParsing m => m a -> m a
- parsecMaybeQuoted :: CabalParsing m => m a -> m a
- parsecCommaList :: CabalParsing m => m a -> m [a]
- parsecLeadingCommaList :: CabalParsing m => m a -> m [a]
- parsecOptCommaList :: CabalParsing m => m a -> m [a]
- parsecStandard :: (CabalParsing m, Parsec ver) => (ver -> String -> a) -> m a
- parsecUnqualComponentName :: CabalParsing m => m String

# Documentation

class Parsec a where #

Class for parsing with `parsec`. Mainly used for `.cabal` file fields.

Minimal complete definition

parsec

Methods

parsec :: CabalParsing m => m a #

Instances

Parsec Bool # |
Instance details Defined in Distribution.Parsec.Class Methods parsec :: CabalParsing m => m Bool #
Parsec Version # |
Instance details Defined in Distribution.Types.Version Methods parsec :: CabalParsing m => m Version #
Parsec VersionRange # |
Instance details Defined in Distribution.Types.VersionRange Methods parsec :: CabalParsing m => m VersionRange #
Parsec RepoType # |
Instance details Defined in Distribution.Types.SourceRepo Methods parsec :: CabalParsing m => m RepoType #
Parsec RepoKind # |
Instance details Defined in Distribution.Types.SourceRepo Methods parsec :: CabalParsing m => m RepoKind #
Parsec PkgconfigName # |
Instance details Defined in Distribution.Types.PkgconfigName Methods parsec :: CabalParsing m => m PkgconfigName #
Parsec ForeignLibType # |
Instance details Defined in Distribution.Types.ForeignLibType Methods parsec :: CabalParsing m => m ForeignLibType #
Parsec ForeignLibOption # |
Instance details Defined in Distribution.Types.ForeignLibOption Methods parsec :: CabalParsing m => m ForeignLibOption #
Parsec ExecutableScope # |
Instance details Defined in Distribution.Types.ExecutableScope Methods parsec :: CabalParsing m => m ExecutableScope #
Parsec ComponentId # |
Instance details Defined in Distribution.Types.ComponentId Methods parsec :: CabalParsing m => m ComponentId #
Parsec BuildType # |
Instance details Defined in Distribution.Types.BuildType Methods parsec :: CabalParsing m => m BuildType #
Parsec AbiHash # |
Instance details Defined in Distribution.Types.AbiHash Methods parsec :: CabalParsing m => m AbiHash #
Parsec Platform # |
Instance details Defined in Distribution.System Methods parsec :: CabalParsing m => m Platform #
Parsec Arch # |
Instance details Defined in Distribution.System Methods parsec :: CabalParsing m => m Arch #
Parsec OS # |
Instance details Defined in Distribution.System Methods parsec :: CabalParsing m => m OS #
Parsec LicenseRef # |
Instance details Defined in Distribution.SPDX.LicenseReference Methods parsec :: CabalParsing m => m LicenseRef #
Parsec LicenseId # |
    >>> eitherParsec "BSD-3-Clause" :: Either String LicenseId
    Right BSD_3_Clause
    >>> eitherParsec "BSD3" :: Either String LicenseId
    Left "...Unknown SPDX license identifier: 'BSD3' Do you mean BSD-3-Clause?"
Instance details Defined in Distribution.SPDX.LicenseId Methods parsec :: CabalParsing m => m LicenseId #
Parsec LicenseExceptionId # |
Instance details Defined in Distribution.SPDX.LicenseExceptionId Methods parsec :: CabalParsing m => m LicenseExceptionId #
Parsec SimpleLicenseExpression # |
Instance details Defined in Distribution.SPDX.LicenseExpression Methods parsec :: CabalParsing m => m SimpleLicenseExpression #
Parsec LicenseExpression # |
Instance details Defined in Distribution.SPDX.LicenseExpression Methods parsec :: CabalParsing m => m LicenseExpression #
Parsec License # |
    >>> eitherParsec "BSD-3-Clause AND MIT" :: Either String License
    Right (License (EAnd (ELicense (ELicenseId BSD_3_Clause) Nothing) (ELicense (ELicenseId MIT) Nothing)))
    >>> eitherParsec "NONE" :: Either String License
    Right NONE
Instance details Defined in Distribution.SPDX.License Methods parsec :: CabalParsing m => m License #
Parsec ModuleName # |
Instance details Defined in Distribution.ModuleName Methods parsec :: CabalParsing m => m ModuleName #
Parsec ModuleRenaming # |
Instance details Defined in Distribution.Types.ModuleRenaming Methods parsec :: CabalParsing m => m ModuleRenaming #
Parsec IncludeRenaming # |
Instance details Defined in Distribution.Types.IncludeRenaming Methods parsec :: CabalParsing m => m IncludeRenaming #
Parsec TestType # |
Instance details Defined in Distribution.Types.TestType Methods parsec :: CabalParsing m => m TestType #
Parsec PkgconfigDependency # |
Instance details Defined in Distribution.Types.PkgconfigDependency Methods parsec :: CabalParsing m => m PkgconfigDependency #
Parsec BenchmarkType # |
Instance details Defined in Distribution.Types.BenchmarkType Methods parsec :: CabalParsing m => m BenchmarkType #
Parsec License # |
Instance details Defined in Distribution.License Methods parsec :: CabalParsing m => m License #
Parsec Extension # |
Instance details Defined in Language.Haskell.Extension Methods parsec :: CabalParsing m => m Extension #
Parsec Language # |
Instance details Defined in Language.Haskell.Extension Methods parsec :: CabalParsing m => m Language #
Parsec CompilerFlavor # |
Instance details Defined in Distribution.Compiler Methods parsec :: CabalParsing m => m CompilerFlavor #
Parsec FilePathNT # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m FilePathNT #
Parsec FreeText # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m FreeText #
Parsec TestedWith # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m TestedWith #
Parsec SpecLicense # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m SpecLicense #
Parsec SpecVersion # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m SpecVersion #
Parsec Token' # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m Token' #
Parsec Token # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m Token #
Parsec PackageName # |
Instance details Defined in Distribution.Types.PackageName Methods parsec :: CabalParsing m => m PackageName #
Parsec UnqualComponentName # |
Instance details Defined in Distribution.Types.UnqualComponentName Methods parsec :: CabalParsing m => m UnqualComponentName #
Parsec DefUnitId # |
Instance details Defined in Distribution.Types.UnitId Methods parsec :: CabalParsing m => m DefUnitId #
Parsec UnitId # | The textual format for `UnitId` coincides with the format GHC accepts for `-package-id`.
Instance details Defined in Distribution.Types.UnitId Methods parsec :: CabalParsing m => m UnitId #
Parsec Module # |
Instance details Defined in Distribution.Types.Module Methods parsec :: CabalParsing m => m Module #
Parsec OpenModule # |
    >>> eitherParsec "Includes2-0.1.0.0-inplace-mysql:Database.MySQL" :: Either String OpenModule
    Right (OpenModule (DefiniteUnitId (DefUnitId {unDefUnitId = UnitId "Includes2-0.1.0.0-inplace-mysql"})) (ModuleName ["Database","MySQL"]))
Instance details Defined in Distribution.Backpack Methods parsec :: CabalParsing m => m OpenModule #
Parsec OpenUnitId # |
    >>> eitherParsec "foobar" :: Either String OpenUnitId
    Right (DefiniteUnitId (DefUnitId {unDefUnitId = UnitId "foobar"}))
    >>> eitherParsec "foo[Str=text-1.2.3:Data.Text.Text]" :: Either String OpenUnitId
    Right (IndefFullUnitId (ComponentId "foo") (fromList [(ModuleName ["Str"],OpenModule (DefiniteUnitId (DefUnitId {unDefUnitId = UnitId "text-1.2.3"})) (ModuleName ["Data","Text","Text"]))]))
Instance details Defined in Distribution.Backpack Methods parsec :: CabalParsing m => m OpenUnitId #
Parsec ModuleReexport # |
Instance details Defined in Distribution.Types.ModuleReexport Methods parsec :: CabalParsing m => m ModuleReexport #
Parsec Mixin # |
Instance details Defined in Distribution.Types.Mixin Methods parsec :: CabalParsing m => m Mixin #
Parsec ExeDependency # |
Instance details Defined in Distribution.Types.ExeDependency Methods parsec :: CabalParsing m => m ExeDependency #
Parsec Dependency # |
Instance details Defined in Distribution.Types.Dependency Methods parsec :: CabalParsing m => m Dependency #
Parsec MungedPackageName # |
Instance details Defined in Distribution.Types.MungedPackageName Methods parsec :: CabalParsing m => m MungedPackageName #
Parsec AbiDependency # |
Instance details Defined in Distribution.Types.AbiDependency Methods parsec :: CabalParsing m => m AbiDependency #
Parsec LegacyExeDependency # |
Instance details Defined in Distribution.Types.LegacyExeDependency Methods parsec :: CabalParsing m => m LegacyExeDependency #
Parsec LibVersionInfo # |
Instance details Defined in Distribution.Types.ForeignLib Methods parsec :: CabalParsing m => m LibVersionInfo #
Parsec FlagName # |
Instance details Defined in Distribution.Types.GenericPackageDescription Methods parsec :: CabalParsing m => m FlagName #
Parsec ExposedModule # |
Instance details Defined in Distribution.Types.ExposedModule Methods parsec :: CabalParsing m => m ExposedModule #
Parsec TestShowDetails # |
Instance details Defined in Distribution.Simple.Setup Methods parsec :: CabalParsing m => m TestShowDetails #
Parsec a => Parsec (Identity a) # |
Instance details Defined in Distribution.Parsec.Class Methods parsec :: CabalParsing m => m (Identity a) #
Parsec a => Parsec (MQuoted a) # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m (MQuoted a) #
(Newtype b a, Sep sep, Parsec b) => Parsec (List sep b a) # |
Instance details Defined in Distribution.Parsec.Newtypes Methods parsec :: CabalParsing m => m (List sep b a) #

newtype ParsecParser a #

Constructors

PP |
Fields unPP :: CabalSpecVersion -> Parsec FieldLineStream [PWarning] a

Instances

Monad ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods (>>=) :: ParsecParser a -> (a -> ParsecParser b) -> ParsecParser b Source # (>>) :: ParsecParser a -> ParsecParser b -> ParsecParser b Source # return :: a -> ParsecParser a Source # fail :: String -> ParsecParser a Source #
Functor ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods fmap :: (a -> b) -> ParsecParser a -> ParsecParser b Source # (<$) :: a -> ParsecParser b -> ParsecParser a Source #
MonadFail ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods fail :: String -> ParsecParser a Source #
Applicative ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods pure :: a -> ParsecParser a Source # (<*>) :: ParsecParser (a -> b) -> ParsecParser a -> ParsecParser b Source # liftA2 :: (a -> b -> c) -> ParsecParser a -> ParsecParser b -> ParsecParser c Source # (*>) :: ParsecParser a -> ParsecParser b -> ParsecParser b Source # (<*) :: ParsecParser a -> ParsecParser b -> ParsecParser a Source #
Alternative ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods empty :: ParsecParser a Source # (<|>) :: ParsecParser a -> ParsecParser a -> ParsecParser a Source # some :: ParsecParser a -> ParsecParser [a] Source # many :: ParsecParser a -> ParsecParser [a] Source #
MonadPlus ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods mzero :: ParsecParser a Source # mplus :: ParsecParser a -> ParsecParser a -> ParsecParser a Source #
Parsing ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods try :: ParsecParser a -> ParsecParser a # (<?>) :: ParsecParser a -> String -> ParsecParser a # skipMany :: ParsecParser a -> ParsecParser () # skipSome :: ParsecParser a -> ParsecParser () # unexpected :: String -> ParsecParser a # eof :: ParsecParser () # notFollowedBy :: Show a => ParsecParser a -> ParsecParser () #
CharParsing ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods satisfy :: (Char -> Bool) -> ParsecParser Char # char :: Char -> ParsecParser Char # notChar :: Char -> ParsecParser Char # anyChar :: ParsecParser Char # string :: String -> ParsecParser String # text :: Text -> ParsecParser Text #
CabalParsing ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods parsecWarning :: PWarnType -> String -> ParsecParser () # parsecHaskellString :: ParsecParser String # askCabalSpecVersion :: ParsecParser CabalSpecVersion #

runParsecParser :: ParsecParser a -> FilePath -> FieldLineStream -> Either ParseError a #

Run `ParsecParser` with `cabalSpecLatest`.

simpleParsec :: Parsec a => String -> Maybe a #

Parse a `String` with `lexemeParsec`.

lexemeParsec :: (CabalParsing m, Parsec a) => m a #

`parsec` could consume trailing spaces, this function will consume.

eitherParsec :: Parsec a => String -> Either String a #

Parse a `String` with `lexemeParsec`.

explicitEitherParsec :: ParsecParser a -> String -> Either String a #

Parse a `String` with given `ParsecParser`. Trailing whitespace is accepted.

# CabalParsing & warnings

class (CharParsing m, MonadPlus m) => CabalParsing m where #

Parsing class which

- can report Cabal parser warnings.
- knows `cabal-version` we work with

Minimal complete definition

parsecWarning, askCabalSpecVersion

Methods

parsecWarning :: PWarnType -> String -> m () #

parsecHaskellString :: m String #

askCabalSpecVersion :: m CabalSpecVersion #

Instances

CabalParsing ParsecParser # |
Instance details Defined in Distribution.Parsec.Class Methods parsecWarning :: PWarnType -> String -> ParsecParser () # parsecHaskellString :: ParsecParser String # askCabalSpecVersion :: ParsecParser CabalSpecVersion #
t ~ Char => CabalParsing (Parser r t) # |
Instance details Defined in Distribution.Parsec.Class Methods parsecWarning :: PWarnType -> String -> Parser r t () # parsecHaskellString :: Parser r t String # askCabalSpecVersion :: Parser r t CabalSpecVersion #

data PWarnType #

Type of parser warning. We do classify warnings.

Different application may decide not to show some, or have fatal behaviour on others

Constructors

PWTOther | Unclassified warning
PWTUTF | Invalid UTF encoding
PWTBoolCase | `true` or `false`, not `True` or `False`
PWTVersionTag | there are version with tags
PWTNewSyntax | New syntax used, but no `cabal-version: >= 1.2` specified
PWTOldSyntax | Old syntax used, and `cabal-version >= 1.2` specified
PWTDeprecatedField |
PWTInvalidSubsection |
PWTUnknownField |
PWTUnknownSection |
PWTTrailingFields |
PWTExtraMainIs | extra main-is field
PWTExtraTestModule | extra test-module field
PWTExtraBenchmarkModule | extra benchmark-module field
PWTLexNBSP |
PWTLexBOM |
PWTLexTab |
PWTQuirkyCabalFile | legacy cabal file that we know how to patch
PWTDoubleDash | Double dash token, most likely it's a mistake - it's not a comment
PWTMultipleSingularField | e.g. name or version should be specified only once.
PWTBuildTypeDefault | Workaround for derive-package having build-type: Default. See https://github.com/haskell/cabal/issues/5020.
PWTVersionLeadingZeros | See https://github.com/haskell-infra/hackage-trustees/issues/128

Instances

Bounded PWarnType # |
Instance details Defined in Distribution.Parsec.Common Methods minBound :: PWarnType Source # maxBound :: PWarnType Source #
Enum PWarnType # |
Instance details Defined in Distribution.Parsec.Common Methods succ :: PWarnType -> PWarnType Source # pred :: PWarnType -> PWarnType Source # toEnum :: Int -> PWarnType Source # fromEnum :: PWarnType -> Int Source # enumFrom :: PWarnType -> [PWarnType] Source # enumFromThen :: PWarnType -> PWarnType -> [PWarnType] Source # enumFromTo :: PWarnType -> PWarnType -> [PWarnType] Source # enumFromThenTo :: PWarnType -> PWarnType -> PWarnType -> [PWarnType] Source #
Eq PWarnType # |
Instance details Defined in Distribution.Parsec.Common Methods (==) :: PWarnType -> PWarnType -> Bool # (/=) :: PWarnType -> PWarnType -> Bool #
Ord PWarnType # |
Instance details Defined in Distribution.Parsec.Common Methods compare :: PWarnType -> PWarnType -> Ordering # (<) :: PWarnType -> PWarnType -> Bool # (<=) :: PWarnType -> PWarnType -> Bool # (>) :: PWarnType -> PWarnType -> Bool # (>=) :: PWarnType -> PWarnType -> Bool # max :: PWarnType -> PWarnType -> PWarnType # min :: PWarnType -> PWarnType -> PWarnType #
Show PWarnType # |
Instance details Defined in Distribution.Parsec.Common Methods showsPrec :: Int -> PWarnType -> ShowS Source # show :: PWarnType -> String Source # showList :: [PWarnType] -> ShowS Source #
Generic PWarnType # |
Instance details Defined in Distribution.Parsec.Common Associated Types type Rep PWarnType :: * -> * Source # Methods from :: PWarnType -> Rep PWarnType x Source # to :: Rep PWarnType x -> PWarnType Source #
NFData PWarnType # |
Instance details Defined in Distribution.Parsec.Common Methods rnf :: PWarnType -> () Source #
Binary PWarnType # |
Instance details Defined in Distribution.Parsec.Common Methods put :: PWarnType -> Put Source # get :: Get PWarnType Source # putList :: [PWarnType] -> Put Source #
type Rep PWarnType # |
Instance details Defined in Distribution.Parsec.Common type Rep PWarnType = D1 (MetaData "PWarnType" "Distribution.Parsec.Common" "Cabal-2.2.0.1" False) ((((C1 (MetaCons "PWTOther" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTUTF" PrefixI False) (U1 :: * -> *)) :+: (C1 (MetaCons "PWTBoolCase" PrefixI False) (U1 :: * -> *) :+: (C1 (MetaCons "PWTVersionTag" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTNewSyntax" PrefixI False) (U1 :: * -> *)))) :+: ((C1 (MetaCons "PWTOldSyntax" PrefixI False) (U1 :: * -> *) :+: (C1 (MetaCons "PWTDeprecatedField" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTInvalidSubsection" PrefixI False) (U1 :: * -> *))) :+: (C1 (MetaCons "PWTUnknownField" PrefixI False) (U1 :: * -> *) :+: (C1 (MetaCons "PWTUnknownSection" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTTrailingFields" PrefixI False) (U1 :: * -> *))))) :+: (((C1 (MetaCons "PWTExtraMainIs" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTExtraTestModule" PrefixI False) (U1 :: * -> *)) :+: (C1 (MetaCons "PWTExtraBenchmarkModule" PrefixI False) (U1 :: * -> *) :+: (C1 (MetaCons "PWTLexNBSP" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTLexBOM" PrefixI False) (U1 :: * -> *)))) :+: ((C1 (MetaCons "PWTLexTab" PrefixI False) (U1 :: * -> *) :+: (C1 (MetaCons "PWTQuirkyCabalFile" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTDoubleDash" PrefixI False) (U1 :: * -> *))) :+: (C1 (MetaCons "PWTMultipleSingularField" PrefixI False) (U1 :: * -> *) :+: (C1 (MetaCons "PWTBuildTypeDefault" PrefixI False) (U1 :: * -> *) :+: C1 (MetaCons "PWTVersionLeadingZeros" PrefixI False) (U1 :: * -> *))))))

# Utilities

parsecToken :: CabalParsing m => m String #

    [^ ,]

parsecToken' :: CabalParsing m => m String #

    [^ ]

parsecFilePath :: CabalParsing m => m FilePath #

parsecQuoted :: CabalParsing m => m a -> m a #

Content isn't unquoted

parsecMaybeQuoted :: CabalParsing m => m a -> m a #

`parsecMaybeQuoted p = `parsecQuoted` p | p`.

parsecCommaList :: CabalParsing m => m a -> m [a] #

parsecLeadingCommaList :: CabalParsing m => m a -> m [a] #

Like `parsecCommaList` but accept leading or trailing comma.

    p (comma p)*  -- p sepBy comma
    (comma p)*    -- leading comma
    (p comma)*    -- trailing comma

parsecOptCommaList :: CabalParsing m => m a -> m [a] #

parsecStandard :: (CabalParsing m, Parsec ver) => (ver -> String -> a) -> m a #

Parse a benchmark/test-suite types.

parsecUnqualComponentName :: CabalParsing m => m String #