# Module Ppx_deriving.Arg

    module Arg: sig .. end

`Ppx_deriving.Arg` contains convenience functions that extract constants from AST fragments, to be used when parsing options or `[@attributes]` attached to types, fields or constructors.

The `~name` argument is used in error messages and should receive the name of the deriving plugin, e.g. `"show"`.

    type 'a conv = Parsetree.expression -> ('a, string) Result.result

A type of conversion functions.

A conversion function of type `'a conv` converts a raw expression into an argument of type `'a`. Or returns `Result.Error "error"` if conversion fails.

    val expr : Parsetree.expression conv

`expr` returns the input expression as-is.

    val bool : bool conv

`bool expr` extracts a boolean constant from `expr`, or returns `Result.Error "boolean"` if `expr` does not contain a boolean literal.

    val int : int conv

`int expr` extracts an integer constant from `expr`, or returns `Result.Error "integer"` if `expr` does not contain an integer literal.

    val string : string conv

`string expr` extracts a string constant from `expr`, or returns `Result.Error "string"` if `expr` does not contain a string literal.

    val char : char conv

`char expr` extracts a char constant from `expr`, or returns `Result.Error "char"` if `expr` does not contain a char literal.

    val enum : string list -> string conv

`enum values expr` extracts a polymorphic variant constant from `expr`, or returns `Result.Error "one of: `a, `b, ..."` if `expr` does not contain a polymorphic variant constructor included in `values`.

    val list : 'a conv -> 'a list conv

`list f expr` extracts a list constant from `expr` and maps every element through `f`, or returns `Result.Error "list:..."` where `...` is the error returned by `f`, or returns `Result.Error "list"` if `expr` does not contain a list.

    val get_attr : deriver:string ->
           'a conv -> Parsetree.attribute option -> 'a option

`get_attr ~deriver conv attr` extracts the expression from `attr` and converts it with `conv`, raising `Location.Error` if `attr` is not a structure with a single expression or `conv` fails; or returns `None` if `attr` is `None`. The name of the deriving plugin should be passed as `deriver`; it is used in error messages.

Example usage:

    let deriver = "index"
    (* ... *)
      let kind =
        match Ppx_deriving.attr ~deriver "kind" pcd_attributes |>
              Ppx_deriving.Arg.(get_attr ~deriver (enum ["flat"; "nested"])) with
        | Some "flat" -> `flat | Some "nested" -> `nested | None -> `default
      in ..

    val get_flag : deriver:string -> Parsetree.attribute option -> bool

`get_flag ~deriver attr` returns `true` if `attr` is an empty attribute or `false` if it is absent, raising `Location.Error` if `attr` is not a structure. The name of the deriving plugin should be passed as `deriver`; it is used in error messages.

    val get_expr : deriver:string -> 'a conv -> Parsetree.expression -> 'a

`get_expr ~deriver conv exp` converts expression `exp` with `conv`, raising `Location.Error` if `conv` fails. The name of the deriving plugin should be passed as `deriver`; it is used in error messages.