# Module Cudf_types

    module Cudf_types: sig .. end

CUDF type library

Implement core CUDF types (see CUDF spec. §2.2.2).

For parsing and pretty printing of CUDF types see `Cudf_types_pp`.

###### CUDF types

    type version = int

    type relop = [ `Eq | `Geq | `Gt | `Leq | `Lt | `Neq ]

    type constr = (relop * version) option

CUDF spec. types

    type pkgname = string

    type vpkg = pkgname * constr

    type vpkglist = vpkg list

    type enum_keep = [ `Keep_feature | `Keep_none | `Keep_package | `Keep_version ]

    type vpkgformula = vpkg list list

CNF formula. Inner lists are OR-ed, outer AND-ed. E.g.:

- "Depends: foo, baz | baz" --> `[ foo ] ; [ bar ; baz ]`
- "Depends: true!" --> ``
- "Depends: false!" --> `[]`

    type veqpkg = pkgname * ([ `Eq ] * version) option

    type veqpkglist = veqpkg list

    type typ = [ `Bool
           | `Enum of string list
           | `Ident
           | `Int
           | `Nat
           | `Pkgname
           | `Posint
           | `String
           | `Typedecl
           | `Veqpkg
           | `Veqpkglist
           | `Vpkg
           | `Vpkgformula
           | `Vpkglist ]

CUDF types

    val keep_type : typ

    val keep_enums : string list

    type typedecl1 = [ `Bool of bool option
           | `Enum of string list * string option
           | `Ident of string option
           | `Int of int option
           | `Nat of int option
           | `Pkgname of string option
           | `Posint of int option
           | `String of string option
           | `Typedecl of typedecl option
           | `Veqpkg of veqpkg option
           | `Veqpkglist of veqpkglist option
           | `Vpkg of vpkg option
           | `Vpkgformula of vpkgformula option
           | `Vpkglist of vpkglist option ]

(Single) type declaration: each variant denotes a type, its argument the default value, None if missing

    type typedecl = (string * typedecl1) list

    type typed_value = [ `Bool of bool
           | `Enum of string list * string
           | `Ident of string
           | `Int of int
           | `Nat of int
           | `Pkgname of string
           | `Posint of int
           | `String of string
           | `Typedecl of typedecl
           | `Veqpkg of veqpkg
           | `Veqpkglist of veqpkglist
           | `Vpkg of vpkg
           | `Vpkgformula of vpkgformula
           | `Vpkglist of vpkglist ]

Typed value in the value space of all CUDF types

###### Manipulation of typed values

    val type_of_typedecl : typedecl1 -> typ

extract the type of a (single) type declaration

    val typedecl_of_value : typed_value -> typedecl1

Create a (single) type declaration having as default value the given typed value (i.e. apply the "Some" monad to typed values)

    val value_of_typedecl : typedecl1 -> typed_value option

Extract the default value from a type declaration (or return `None`)

    val typedecl_of_type : typ -> typedecl1

Create a (single) type declaration with no default value

    val type_of_value : typed_value -> typ

- Returns the type of a given value

    val cast : typ -> typed_value -> typed_value

`cast ty v` attempt a runtime cast of a given (typed) value to a different type.

- Raises `Type_error` if casting is not possible

CUDF syntactic types

Types used in parsing, before values are injected into the CUDF type system.

    type 'ty stanza = (string * 'ty) list

RFC-822-like stanza, i.e. an associative list mapping property names to property values.

Values are typed according to the type variable `'ty`. Usually, libCUDF uses either `string stanza` (for untyped stanzas) or `Cudf_types.typed_value stanza` (for typed stanzas).

###### Various errors

    exception Parse_error_822 of string * loc

Error while parsing RFC822-like syntax of CUDF documents.

arguments: error message and file range, respectively.

    exception Syntax_error of string * loc

Syntax error while parsing some literal value

arguments: error message and file range, respectively

    exception Type_error of typ * typed_value * loc

Type error: mismatch between typed value and expected type

arguments: expected type, found value

###### Accessors, predicates, etc.

    val is_eq_formula : vpkgformula -> bool

Check whether a formula uses only equality tests over package versions.