| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
Distribution.FieldGrammar.Parsec
Contents
Description
This module provides a FieldGrammarParser, one way to parse
.cabal -like files.
Fields can be specified multiple times in the .cabal files. The order of such entries is important, but the mutual ordering of different fields is not.Also conditional sections are considered after non-conditional data. The example of this silent-commutation quirk is the fact that
buildable: True if os(linux) buildable: False
and
if os(linux) buildable: False buildable: True
behave the same! This is the limitation of GeneralPackageDescription
structure.
So we transform the list of fields [ into
a map of grouped ordinary fields and a list of lists of sections:
Field ann] and Fields ann = Map FieldName [NamelessField ann][[.Section ann]]
We need list of list of sections, because we need to distinguish situations where there are fields in between. For example
if flag(bytestring-lt-0_10_4) build-depends: bytestring < 0.10.4 default-language: Haskell2020 else build-depends: bytestring >= 0.10.4
is obviously invalid specification.
We can parse Fields like we parse aeson objects, yet we use
slightly higher-level API, so we can process unspecified fields,
to report unknown fields and save custom x-fields.
Synopsis
- data ParsecFieldGrammar s a
- parseFieldGrammar :: CabalSpecVersion -> Fields Position -> ParsecFieldGrammar s a -> ParseResult a
- fieldGrammarKnownFieldList :: ParsecFieldGrammar s a -> [FieldName]
- type Fields ann = Map FieldName [NamelessField ann]
- data NamelessField ann = MkNamelessField !ann [FieldLine ann]
- namelessFieldAnn :: NamelessField ann -> ann
- data Section ann = MkSection !(Name ann) [SectionArg ann] [Field ann]
- runFieldParser :: Position -> ParsecParser a -> CabalSpecVersion -> [FieldLine Position] -> ParseResult a
- runFieldParser' :: [Position] -> ParsecParser a -> CabalSpecVersion -> FieldLineStream -> ParseResult a
- fieldLinesToStream :: [FieldLine ann] -> FieldLineStream
Documentation
data ParsecFieldGrammar s a #
Instances
parseFieldGrammar :: CabalSpecVersion -> Fields Position -> ParsecFieldGrammar s a -> ParseResult a #
fieldGrammarKnownFieldList :: ParsecFieldGrammar s a -> [FieldName] #
Auxiliary
type Fields ann = Map FieldName [NamelessField ann] #
data NamelessField ann #
Single field, without name, but with its annotation.
Constructors
| MkNamelessField !ann [FieldLine ann] |
Instances
| Functor NamelessField # | |
Defined in Distribution.FieldGrammar.Parsec Methods fmap :: (a -> b) -> NamelessField a -> NamelessField b Source # (<$) :: a -> NamelessField b -> NamelessField a Source # | |
| Show ann => Show (NamelessField ann) # | |
Defined in Distribution.FieldGrammar.Parsec | |
| Eq ann => Eq (NamelessField ann) # | |
Defined in Distribution.FieldGrammar.Parsec Methods (==) :: NamelessField ann -> NamelessField ann -> Bool # (/=) :: NamelessField ann -> NamelessField ann -> Bool # | |
namelessFieldAnn :: NamelessField ann -> ann #
Constructors
| MkSection !(Name ann) [SectionArg ann] [Field ann] |
runFieldParser :: Position -> ParsecParser a -> CabalSpecVersion -> [FieldLine Position] -> ParseResult a #
runFieldParser' :: [Position] -> ParsecParser a -> CabalSpecVersion -> FieldLineStream -> ParseResult a #
fieldLinesToStream :: [FieldLine ann] -> FieldLineStream #