# Module Cudf_parser

    module Cudf_parser: sig .. end

Parser for CUDF related documents

    type cudf_parser

a CUDF parser opened on some input source

    exception Parse_error of string * Cudf_types.loc

Error during parsing (syntax error, type error, ...). Arguments are error message and error location.

    val from_in_channel : ?typedecl:Cudf_conf.stanza_typedecl ->
           Stdlib.in_channel -> cudf_parser

create a CUDF parser reading data from an input channel

`typedecl` : (initial) per-stanza and per-property type declarations to be used while parsing. Default: `Cudf_conf.stanza_typedecl`

    val from_IO_in_channel : ?typedecl:Cudf_conf.stanza_typedecl -> IO.input -> cudf_parser

create a CUDF parser reading data from an Extlib input channel

`typedecl` : (initial) per-stanza and per-property type declarations to be used while parsing. Default: `Cudf_conf.stanza_typedecl`

    val from_file : ?typedecl:Cudf_conf.stanza_typedecl -> string -> cudf_parser

create a CUDF parser reading data from a file

`typedecl` : as per `Cudf_parser.from_in_channel`

    val close : cudf_parser -> unit

Dispose a CUDF parser.

Afterwards, the parser should not be used any longer

Full CUDF document parsing

"parse_*" functions offer plain syntax parsing, with no semantic interpretation of what is being parsed. "load_*" functions offer the latter, hence also checking for semantic constraints (such as the lack of key duplication).

All full parsing function are granted to raise only `Cudf_parser.Parse_error`; finer grained exception are mapped to it.

    val parse : cudf_parser ->
           Cudf.preamble option * Cudf.package list * Cudf.request option

parse a CUDF document (or a universe) as a whole

- Raises `Parse_error` when an error during parsing is encountered (might be a syntax error, a type error, ..)
- Returns a triple `preamble, packages, request` where preamble and request are returned only if actually met in the parsed document. Note that a document with no request part is not a valid CUDF document (but might still be used to represent solver solutions, for instance).

    val load : cudf_parser ->
           Cudf.preamble option * Cudf.universe * Cudf.request option

same as `Cudf_parser.parse`, but additionally loads the package list as an abstract `Cudf.universe`.

Note: to load compact universes (i.e. only containing package names, versions, and installed status) that will be tested as solutions you should use `Cudf_parser.load_solution` instead: the present function does not expand missing metadata with respect to the initial status.

- Raises
  - `Parse_error` as `Cudf_parser.parse` does
  - `Cudf.Constraint_violation` as `Cudf.load_universe` does

    val load_solution : cudf_parser ->
           Cudf.universe -> Cudf.preamble option * Cudf.universe

Load a solution wrt to a given CUDF document, whose universe is given.

Solution format is as per Appendix B of CUDF 2.0 spec

- Raises `Parse_error` as `Cudf_parser.parse` does

    val parse_from_file : ?typedecl:Cudf_conf.stanza_typedecl ->
           string -> Cudf.preamble option * Cudf.package list * Cudf.request option

Shorthand: parse a file given its name

    val load_from_file : ?typedecl:Cudf_conf.stanza_typedecl ->
           string -> Cudf.preamble option * Cudf.universe * Cudf.request option

Shorthand: load from a file given its name

    val load_solution_from_file : string -> Cudf.universe -> Cudf.preamble option * Cudf.universe

Shorthand: load a solution from a file given its name

Item-by-item CUDF parsing

    val parse_item : cudf_parser -> Cudf.cudf_item

Parse the next information item (either a package description, a user request, or a preamble) from the given input channel.

Beware that parsing is stateful; in particular when the preamble is parsed, the list of allowed properties for future package stanzas is internally updated.

Low-level parsing functions

The following parsing function usually raise fine grained exceptions such as `Cudf_types.Syntax_error` and `Cudf_types.Type_error`.

    type loc_map = (string * Cudf_types.loc) list

    val parse_stanza : cudf_parser -> loc_map * string Cudf_types.stanza

Parse a file stanza (i.e., a RFC822-like stanza, with the notable simplification that all field/value pairs are one-liners). Strip any heading blanks lines leading to the first available field/value pair.

- Raises
  - `End_of_file` if no other stanza is available due to reached EOF
  - `Cudf_types.Syntax_error` when a syntax error is encountered
- Returns an associative list mapping field name to field values and a location map mapping field names to locations

    val type_check_stanza : ?locs:loc_map ->
           string Cudf_types.stanza ->
           Cudf_types.typedecl -> Cudf_types.typed_value Cudf_types.stanza

Type check an untyped stanza according to a given set of type declarations. Also take care of default values, adding missing properties where needed; fail if a required property is missing.

- Raises
  - `Syntax_error` if a property does not match its declared type; this exception is also raised when an undeclared property is encountered
  - `Type_error` when a property has a value of the wrong type