package ppx_protocol_conv
Install
Dune Dependency
Authors
Maintainers
Sources
md5=5eddd4cc3ef4fce45dacc1add7f82ff7
sha512=f947bfb488b62114b765c8479ae06818c6823ca8be14c454273f09d9390cb405be7add78953291cfc3a9ffbcc79418c57b35144136c17f4c458ab52be8185ed4
Description
Ppx_protocol_conv generates code to serialize and de-serialize types. The ppx itself does not contain any protocol specific code, but relies on 'drivers' that defines serialisation and de-serialisation of basic types and structures.
Pre-defined drivers are available in separate packages: ppx_protocol_conv_json (Yojson.Safe.json) ppx_protocol_conv_jsonm (Ezjson.value) ppx_protocol_conv_msgpack (Msgpck.t) ppx_protocol_conv_xml-light (Xml.xml) ppx_protocol_conv_yaml (Yaml.value)
Published: 03 Jan 2020
README
Ppx Protocol Conv
Ppx protocol conv (de)serializers using deriving, which allows for plugable (de)serializers. Api.
This page contains an simple overview of functionality provided. More information is available in the wiki pages
Table of contents
Features
The ppx supports the following features:
records
recursive and non-recursive types
variants
polymophic variants
All primitive types (except nativeint)
The following drivers exists
Json
which serializes toYojson.Safe.t
Jsonm
which serializes toEzjsonm.value
Msgpack
which serializes toMsgpck.t
Yaml
which serializes toYaml.t
Xml_light
which serializes toXml.xml list
Examples
open Protocol_conv_json
type a = {
x: int;
y: string [@key "Y"]
z: int list [@default [2;3]]
} [@@deriving protocol ~driver:(module Json)]
type b = A of int
| B of int [@key "b"]
| C
[@@deriving protocol ~driver:(module Json)]
will generate the functions:
val a_to_json: a -> Json.t
val a_of_json_exn: Json.t -> a
val a_of_json: Json.t -> (a, exn) result
val b_to_json: a -> Json.t
val b_of_json_exn: Json.t -> a
val b_of_json: Json.t -> (b, exn) result
a_to_json { x=42; y:"really"; z:[6;7] }
Evaluates to
[ "x", `Int 42; "Y", `String "really"; "z", `List [ `Int 6; `Int 7 ] ] (* Yojson.Safe.json *)
to_protocol
deriver will generate serilisation of the type. of_protocol
deriver generates de-serilisation of the type, while protocol
deriver will generate both serilisation and de-serilisation functions.
Attributes
Record label names can be changed using [@key <string>]
Variant and polymorphic variant constructors names can be changed using the [@name <string>]
attribute.
If a record field is not present in the input when deserialising, as default value can be assigned using [@default <expr>]
. If the value to be serialized matches the default value, the field will be omitted (Some drivers allow disabling this functonality. Comparrison uses polymorphic compare, so be careful.
Signatures
The ppx also handles signature, but disallows [@key ...]
, [@default ...]
and [@name] ....
as these does not impact signatures.
Drivers
Drivers specify concrete serialization and deserialization. Users of the library can elect to implement their own driver see custom drivers, or use predefined drivers:
Json
which serializes toYojson.Safe.t
Jsonm
which serializes toEzjsonm.value
Msgpack
which serializes toMsgpck.t
Yaml
which serializes toYaml.t
Xml_light
which serializes toXml.xml list
Custom drivers
It is easy to provide custom drivers by implementing the signature:
include Protocol_conv.Runtime.Driver with
type t = ...
See the drivers
directory for examples on how to implemented new drivers. Submissions of new drivers are more than welcome.
Not supported
Generalised algebraic datatypes
Extensible types
Extensible polymorphic variants
Dev Dependencies (3)
-
alcotest
with-test & >= "0.8.0"
-
sexplib
with-test & < "v0.14"
-
ppx_sexp_conv
with-test & < "v0.14"
Used by (6)
-
ppx_deriving_protocol
>= "0.8.1"
-
ppx_protocol_conv_json
= "5.1.0"
-
ppx_protocol_conv_jsonm
= "5.1.0"
-
ppx_protocol_conv_msgpack
= "5.1.0"
-
ppx_protocol_conv_xml_light
= "5.1.0"
-
ppx_protocol_conv_yaml
= "5.1.0"
Conflicts
None