Distribution.FieldGrammar

Cabal-3.2.1.0: A framework for packaging Haskell software

Safe Haskell | None
Language | Haskell2010

Distribution.FieldGrammar

Contents

- Field grammar type
- Concrete grammar implementations
- Auxlilary

Description

This module provides a way to specify a grammar of `.cabal` -like files.

Synopsis

- class FieldGrammar g where
  - blurFieldGrammar :: ALens' a b -> g b c -> g a c
  - uniqueFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> g s a
  - booleanFieldDef :: FieldName -> ALens' s Bool -> Bool -> g s Bool
  - optionalFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s (Maybe a) -> g s (Maybe a)
  - optionalFieldDefAla :: (Parsec b, Pretty b, Newtype a b, Eq a) => FieldName -> (a -> b) -> ALens' s a -> a -> g s a
  - freeTextField :: FieldName -> ALens' s (Maybe String) -> g s (Maybe String)
  - freeTextFieldDef :: FieldName -> ALens' s String -> g s String
  - freeTextFieldDefST :: FieldName -> ALens' s ShortText -> g s ShortText
  - monoidalFieldAla :: (Parsec b, Pretty b, Monoid a, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> g s a
  - prefixedFields :: FieldName -> ALens' s [(String, String)] -> g s [(String, String)]
  - knownField :: FieldName -> g s ()
  - hiddenField :: g s a -> g s a
  - deprecatedSince :: CabalSpecVersion -> String -> g s a -> g s a
  - removedIn :: CabalSpecVersion -> String -> g s a -> g s a
  - availableSince :: CabalSpecVersion -> a -> g s a -> g s a
- uniqueField :: (FieldGrammar g, Parsec a, Pretty a) => FieldName -> ALens' s a -> g s a
- optionalField :: (FieldGrammar g, Parsec a, Pretty a) => FieldName -> ALens' s (Maybe a) -> g s (Maybe a)
- optionalFieldDef :: (FieldGrammar g, Functor (g s), Parsec a, Pretty a, Eq a) => FieldName -> ALens' s a -> a -> g s a
- monoidalField :: (FieldGrammar g, Parsec a, Pretty a, Monoid a) => FieldName -> ALens' s a -> g s a
- data ParsecFieldGrammar s a
- type ParsecFieldGrammar' a = ParsecFieldGrammar a a
- parseFieldGrammar :: CabalSpecVersion -> Fields Position -> ParsecFieldGrammar s a -> ParseResult a
- fieldGrammarKnownFieldList :: ParsecFieldGrammar s a -> [FieldName]
- data PrettyFieldGrammar s a
- type PrettyFieldGrammar' a = PrettyFieldGrammar a a
- prettyFieldGrammar :: CabalSpecVersion -> PrettyFieldGrammar s a -> s -> [PrettyField ()]
- (^^^) :: a -> (a -> b) -> b
- data Section ann = MkSection !(Name ann) [SectionArg ann] [Field ann]
- type Fields ann = Map FieldName [NamelessField ann]
- partitionFields :: [Field ann] -> (Fields ann, [[Section ann]])
- takeFields :: [Field ann] -> (Fields ann, [Field ann])
- runFieldParser :: Position -> ParsecParser a -> CabalSpecVersion -> [FieldLine Position] -> ParseResult a
- runFieldParser' :: [Position] -> ParsecParser a -> CabalSpecVersion -> FieldLineStream -> ParseResult a
- defaultFreeTextFieldDefST :: (Functor (g s), FieldGrammar g) => FieldName -> ALens' s ShortText -> g s ShortText

# Field grammar type

class FieldGrammar g where Source #

`FieldGrammar` is parametrised by

- `s` which is a structure we are parsing. We need this to provide prettyprinter functionality
- `a` type of the field.

Note: We'd like to have `forall s. Applicative (f s)` context.

Methods

blurFieldGrammar :: ALens' a b -> g b c -> g a c Source #

Unfocus, zoom out, blur `FieldGrammar`.

uniqueFieldAla Source #

Arguments

:: (Parsec b, Pretty b, Newtype a b) |
=> FieldName | field name
-> (a -> b) | `Newtype` pack
-> ALens' s a | lens into the field
-> g s a |

Field which should be defined, exactly once.

booleanFieldDef Source #

Arguments

:: FieldName | field name
-> ALens' s Bool | lens into the field
-> Bool | default
-> g s Bool |

Boolean field with a default value.

optionalFieldAla Source #

Arguments

:: (Parsec b, Pretty b, Newtype a b) |
=> FieldName | field name
-> (a -> b) | `pack`
-> ALens' s (Maybe a) | lens into the field
-> g s (Maybe a) |

Optional field.

optionalFieldDefAla Source #

Arguments

:: (Parsec b, Pretty b, Newtype a b, Eq a) |
=> FieldName | field name
-> (a -> b) | `Newtype` pack
-> ALens' s a | ``Lens'` s a`: lens into the field
-> a | default value
-> g s a |

Optional field with default value.

freeTextField Source #

Arguments

:: FieldName |
-> ALens' s (Maybe String) | lens into the field
-> g s (Maybe String) |

freeTextFieldDef Source #

Arguments

:: FieldName |
-> ALens' s String | lens into the field
-> g s String |

freeTextFieldDefST Source #

Arguments

:: FieldName |
-> ALens' s ShortText | lens into the field
-> g s ShortText |

Since: Cabal-3.2.0.0

monoidalFieldAla Source #

Arguments

:: (Parsec b, Pretty b, Monoid a, Newtype a b) |
=> FieldName | field name
-> (a -> b) | `pack`
-> ALens' s a | lens into the field
-> g s a |

Monoidal field.

Values are combined with `mappend`.

Note: `optionalFieldAla` is a `monoidalField` with `Last` monoid.

prefixedFields Source #

Arguments

:: FieldName | field name prefix
-> ALens' s [(String, String)] | lens into the field
-> g s [(String, String)] |

Parser matching all fields with a name starting with a prefix.

knownField :: FieldName -> g s () Source #

Known field, which we don't parse, neither pretty print.

hiddenField :: g s a -> g s a Source #

Field which is parsed but not pretty printed.

deprecatedSince Source #

Arguments

:: CabalSpecVersion | version
-> String | deprecation message
-> g s a |
-> g s a |

Deprecated since

removedIn Source #

Arguments

:: CabalSpecVersion | version
-> String | removal message
-> g s a |
-> g s a |

Removed in. If we occur removed field, parsing fails.

availableSince Source #

Arguments

:: CabalSpecVersion | spec version
-> a | default value
-> g s a |
-> g s a |

Annotate field with since spec-version.

#### Instances

Instances details

FieldGrammar PrettyFieldGrammar # |
Instance details Defined in Distribution.FieldGrammar.Pretty Methods blurFieldGrammar :: ALens' a b -> PrettyFieldGrammar b c -> PrettyFieldGrammar a c Source # uniqueFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> PrettyFieldGrammar s a Source # booleanFieldDef :: FieldName -> ALens' s Bool -> Bool -> PrettyFieldGrammar s Bool Source # optionalFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s (Maybe a) -> PrettyFieldGrammar s (Maybe a) Source # optionalFieldDefAla :: (Parsec b, Pretty b, Newtype a b, Eq a) => FieldName -> (a -> b) -> ALens' s a -> a -> PrettyFieldGrammar s a Source # freeTextField :: FieldName -> ALens' s (Maybe String) -> PrettyFieldGrammar s (Maybe String) Source # freeTextFieldDef :: FieldName -> ALens' s String -> PrettyFieldGrammar s String Source # freeTextFieldDefST :: FieldName -> ALens' s ShortText -> PrettyFieldGrammar s ShortText Source # monoidalFieldAla :: (Parsec b, Pretty b, Monoid a, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> PrettyFieldGrammar s a Source # prefixedFields :: FieldName -> ALens' s [(String, String)] -> PrettyFieldGrammar s [(String, String)] Source # knownField :: FieldName -> PrettyFieldGrammar s () Source # hiddenField :: PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source # deprecatedSince :: CabalSpecVersion -> String -> PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source # removedIn :: CabalSpecVersion -> String -> PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source # availableSince :: CabalSpecVersion -> a -> PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source #
FieldGrammar ParsecFieldGrammar # |
Instance details Defined in Distribution.FieldGrammar.Parsec Methods blurFieldGrammar :: ALens' a b -> ParsecFieldGrammar b c -> ParsecFieldGrammar a c Source # uniqueFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> ParsecFieldGrammar s a Source # booleanFieldDef :: FieldName -> ALens' s Bool -> Bool -> ParsecFieldGrammar s Bool Source # optionalFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s (Maybe a) -> ParsecFieldGrammar s (Maybe a) Source # optionalFieldDefAla :: (Parsec b, Pretty b, Newtype a b, Eq a) => FieldName -> (a -> b) -> ALens' s a -> a -> ParsecFieldGrammar s a Source # freeTextField :: FieldName -> ALens' s (Maybe String) -> ParsecFieldGrammar s (Maybe String) Source # freeTextFieldDef :: FieldName -> ALens' s String -> ParsecFieldGrammar s String Source # freeTextFieldDefST :: FieldName -> ALens' s ShortText -> ParsecFieldGrammar s ShortText Source # monoidalFieldAla :: (Parsec b, Pretty b, Monoid a, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> ParsecFieldGrammar s a Source # prefixedFields :: FieldName -> ALens' s [(String, String)] -> ParsecFieldGrammar s [(String, String)] Source # knownField :: FieldName -> ParsecFieldGrammar s () Source # hiddenField :: ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source # deprecatedSince :: CabalSpecVersion -> String -> ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source # removedIn :: CabalSpecVersion -> String -> ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source # availableSince :: CabalSpecVersion -> a -> ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source #
FieldGrammar FieldDescrs # | Note: default values are printed.
Instance details Defined in Distribution.FieldGrammar.FieldDescrs Methods blurFieldGrammar :: ALens' a b -> FieldDescrs b c -> FieldDescrs a c Source # uniqueFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> FieldDescrs s a Source # booleanFieldDef :: FieldName -> ALens' s Bool -> Bool -> FieldDescrs s Bool Source # optionalFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s (Maybe a) -> FieldDescrs s (Maybe a) Source # optionalFieldDefAla :: (Parsec b, Pretty b, Newtype a b, Eq a) => FieldName -> (a -> b) -> ALens' s a -> a -> FieldDescrs s a Source # freeTextField :: FieldName -> ALens' s (Maybe String) -> FieldDescrs s (Maybe String) Source # freeTextFieldDef :: FieldName -> ALens' s String -> FieldDescrs s String Source # freeTextFieldDefST :: FieldName -> ALens' s ShortText -> FieldDescrs s ShortText Source # monoidalFieldAla :: (Parsec b, Pretty b, Monoid a, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> FieldDescrs s a Source # prefixedFields :: FieldName -> ALens' s [(String, String)] -> FieldDescrs s [(String, String)] Source # knownField :: FieldName -> FieldDescrs s () Source # hiddenField :: FieldDescrs s a -> FieldDescrs s a Source # deprecatedSince :: CabalSpecVersion -> String -> FieldDescrs s a -> FieldDescrs s a Source # removedIn :: CabalSpecVersion -> String -> FieldDescrs s a -> FieldDescrs s a Source # availableSince :: CabalSpecVersion -> a -> FieldDescrs s a -> FieldDescrs s a Source #

uniqueField Source #

Arguments

:: (FieldGrammar g, Parsec a, Pretty a) |
=> FieldName | field name
-> ALens' s a | lens into the field
-> g s a |

Field which can be defined at most once.

optionalField Source #

Arguments

:: (FieldGrammar g, Parsec a, Pretty a) |
=> FieldName | field name
-> ALens' s (Maybe a) | lens into the field
-> g s (Maybe a) |

Field which can be defined at most once.

optionalFieldDef Source #

Arguments

:: (FieldGrammar g, Functor (g s), Parsec a, Pretty a, Eq a) |
=> FieldName | field name
-> ALens' s a | ``Lens'` s a`: lens into the field
-> a | default value
-> g s a |

Optional field with default value.

monoidalField Source #

Arguments

:: (FieldGrammar g, Parsec a, Pretty a, Monoid a) |
=> FieldName | field name
-> ALens' s a | lens into the field
-> g s a |

Field which can be define multiple times, and the results are `mappend`ed.

# Concrete grammar implementations

data ParsecFieldGrammar s a Source #

#### Instances

Instances details

FieldGrammar ParsecFieldGrammar # |
Instance details Defined in Distribution.FieldGrammar.Parsec Methods blurFieldGrammar :: ALens' a b -> ParsecFieldGrammar b c -> ParsecFieldGrammar a c Source # uniqueFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> ParsecFieldGrammar s a Source # booleanFieldDef :: FieldName -> ALens' s Bool -> Bool -> ParsecFieldGrammar s Bool Source # optionalFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s (Maybe a) -> ParsecFieldGrammar s (Maybe a) Source # optionalFieldDefAla :: (Parsec b, Pretty b, Newtype a b, Eq a) => FieldName -> (a -> b) -> ALens' s a -> a -> ParsecFieldGrammar s a Source # freeTextField :: FieldName -> ALens' s (Maybe String) -> ParsecFieldGrammar s (Maybe String) Source # freeTextFieldDef :: FieldName -> ALens' s String -> ParsecFieldGrammar s String Source # freeTextFieldDefST :: FieldName -> ALens' s ShortText -> ParsecFieldGrammar s ShortText Source # monoidalFieldAla :: (Parsec b, Pretty b, Monoid a, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> ParsecFieldGrammar s a Source # prefixedFields :: FieldName -> ALens' s [(String, String)] -> ParsecFieldGrammar s [(String, String)] Source # knownField :: FieldName -> ParsecFieldGrammar s () Source # hiddenField :: ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source # deprecatedSince :: CabalSpecVersion -> String -> ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source # removedIn :: CabalSpecVersion -> String -> ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source # availableSince :: CabalSpecVersion -> a -> ParsecFieldGrammar s a -> ParsecFieldGrammar s a Source #
Functor (ParsecFieldGrammar s) # |
Instance details Defined in Distribution.FieldGrammar.Parsec Methods fmap :: (a -> b) -> ParsecFieldGrammar s a -> ParsecFieldGrammar s b Source # (<$) :: a -> ParsecFieldGrammar s b -> ParsecFieldGrammar s a Source #
Applicative (ParsecFieldGrammar s) # |
Instance details Defined in Distribution.FieldGrammar.Parsec Methods pure :: a -> ParsecFieldGrammar s a Source # (<*>) :: ParsecFieldGrammar s (a -> b) -> ParsecFieldGrammar s a -> ParsecFieldGrammar s b Source # liftA2 :: (a -> b -> c) -> ParsecFieldGrammar s a -> ParsecFieldGrammar s b -> ParsecFieldGrammar s c Source # (*>) :: ParsecFieldGrammar s a -> ParsecFieldGrammar s b -> ParsecFieldGrammar s b Source # (<*) :: ParsecFieldGrammar s a -> ParsecFieldGrammar s b -> ParsecFieldGrammar s a Source #

type ParsecFieldGrammar' a = ParsecFieldGrammar a a Source #

parseFieldGrammar :: CabalSpecVersion -> Fields Position -> ParsecFieldGrammar s a -> ParseResult a Source #

fieldGrammarKnownFieldList :: ParsecFieldGrammar s a -> [FieldName] Source #

data PrettyFieldGrammar s a Source #

#### Instances

Instances details

FieldGrammar PrettyFieldGrammar # |
Instance details Defined in Distribution.FieldGrammar.Pretty Methods blurFieldGrammar :: ALens' a b -> PrettyFieldGrammar b c -> PrettyFieldGrammar a c Source # uniqueFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> PrettyFieldGrammar s a Source # booleanFieldDef :: FieldName -> ALens' s Bool -> Bool -> PrettyFieldGrammar s Bool Source # optionalFieldAla :: (Parsec b, Pretty b, Newtype a b) => FieldName -> (a -> b) -> ALens' s (Maybe a) -> PrettyFieldGrammar s (Maybe a) Source # optionalFieldDefAla :: (Parsec b, Pretty b, Newtype a b, Eq a) => FieldName -> (a -> b) -> ALens' s a -> a -> PrettyFieldGrammar s a Source # freeTextField :: FieldName -> ALens' s (Maybe String) -> PrettyFieldGrammar s (Maybe String) Source # freeTextFieldDef :: FieldName -> ALens' s String -> PrettyFieldGrammar s String Source # freeTextFieldDefST :: FieldName -> ALens' s ShortText -> PrettyFieldGrammar s ShortText Source # monoidalFieldAla :: (Parsec b, Pretty b, Monoid a, Newtype a b) => FieldName -> (a -> b) -> ALens' s a -> PrettyFieldGrammar s a Source # prefixedFields :: FieldName -> ALens' s [(String, String)] -> PrettyFieldGrammar s [(String, String)] Source # knownField :: FieldName -> PrettyFieldGrammar s () Source # hiddenField :: PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source # deprecatedSince :: CabalSpecVersion -> String -> PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source # removedIn :: CabalSpecVersion -> String -> PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source # availableSince :: CabalSpecVersion -> a -> PrettyFieldGrammar s a -> PrettyFieldGrammar s a Source #
Functor (PrettyFieldGrammar s) # |
Instance details Defined in Distribution.FieldGrammar.Pretty Methods fmap :: (a -> b) -> PrettyFieldGrammar s a -> PrettyFieldGrammar s b Source # (<$) :: a -> PrettyFieldGrammar s b -> PrettyFieldGrammar s a Source #
Applicative (PrettyFieldGrammar s) # |
Instance details Defined in Distribution.FieldGrammar.Pretty Methods pure :: a -> PrettyFieldGrammar s a Source # (<*>) :: PrettyFieldGrammar s (a -> b) -> PrettyFieldGrammar s a -> PrettyFieldGrammar s b Source # liftA2 :: (a -> b -> c) -> PrettyFieldGrammar s a -> PrettyFieldGrammar s b -> PrettyFieldGrammar s c Source # (*>) :: PrettyFieldGrammar s a -> PrettyFieldGrammar s b -> PrettyFieldGrammar s b Source # (<*) :: PrettyFieldGrammar s a -> PrettyFieldGrammar s b -> PrettyFieldGrammar s a Source #

type PrettyFieldGrammar' a = PrettyFieldGrammar a a Source #

prettyFieldGrammar :: CabalSpecVersion -> PrettyFieldGrammar s a -> s -> [PrettyField ()] Source #

We can use `PrettyFieldGrammar` to pp print the `s`.

Note: there is not trailing `($+$ text "")`.

# Auxlilary

(^^^) :: a -> (a -> b) -> b infixl 5 Source #

Reverse function application which binds tighter than `<$>` and `<*>`. Useful for refining grammar specification.

    <*> monoidalFieldAla "extensions"           (alaList' FSep MQuoted)       oldExtensions
        ^^^ deprecatedSince [1,12] "Please use 'default-extensions' or 'other-extensions' fields."

data Section ann Source #

The `Section` constructor of `Field`.

Constructors

MkSection !(Name ann) [SectionArg ann] [Field ann] |

#### Instances

Instances details

Functor Section # |
Instance details Defined in Distribution.FieldGrammar.Parsec Methods fmap :: (a -> b) -> Section a -> Section b Source # (<$) :: a -> Section b -> Section a Source #
Eq ann => Eq (Section ann) # |
Instance details Defined in Distribution.FieldGrammar.Parsec Methods (==) :: Section ann -> Section ann -> Bool # (/=) :: Section ann -> Section ann -> Bool #
Show ann => Show (Section ann) # |
Instance details Defined in Distribution.FieldGrammar.Parsec Methods showsPrec :: Int -> Section ann -> ShowS Source # show :: Section ann -> String Source # showList :: [Section ann] -> ShowS Source #

type Fields ann = Map FieldName [NamelessField ann] Source #

partitionFields :: [Field ann] -> (Fields ann, [[Section ann]]) Source #

Partition field list into field map and groups of sections.

takeFields :: [Field ann] -> (Fields ann, [Field ann]) Source #

Take all fields from the front.

runFieldParser :: Position -> ParsecParser a -> CabalSpecVersion -> [FieldLine Position] -> ParseResult a Source #

runFieldParser' :: [Position] -> ParsecParser a -> CabalSpecVersion -> FieldLineStream -> ParseResult a Source #

defaultFreeTextFieldDefST Source #

Arguments

:: (Functor (g s), FieldGrammar g) |
=> FieldName |
-> ALens' s ShortText | lens into the field
-> g s ShortText |

Default implementation for `freeTextFieldDefST`.