BuckleScript runtime for atdgen
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
__tests__
src
.gitignore
.ocamlformat
README.md
bsconfig.json
package.json

README.md

bs-atdgen-codec-runtime

Runtime for using atdgen and BuckleScript together.

Installation

$ yarn add @osener/bs-atdgen-codec-runtime

Then add @glennsl/bs-json to bs-dependencies in your bsconfig.json:

{
  ...
  "bs-dependencies": ["@osener/bs-atdgen-codec-runtime"]
}

You will also need development version of atdgen:

$ opam pin add --yes https://github.com/mjambon/atd.git

Usage

Create an .atd file:

(* protocol.atd *)

type pet = [
  | Cat of string
  | Dog of string    
  ]

type person =
  { name : string
  ; age : int
  ; ~student : bool
  ; ?pet : pet option 
  }

type request =
  [ Greeting of person ]

Use atdgen to generate your types and BuckleScript parsers:

# Generate protocol_t.[ml/mli] and protocol_bs.[ml/mli] 
$ atdgen -t protocol.atd && atdgen -bs -open Protocol_t protocol.atd
$ atdgen -bs -open Protocol_t protocol.atd

Finally, use the generated modules for parsing and serialization:

OCaml

(** Parse JSON string *)
let () =
  let request =
    {| ["Greeting",{"name":"Turner","age":33,"pet":["Dog","Hooch"]}] |}
    |> Json.parseOrRaise
    |> Atdgen_codec_runtime.Decode.decode Protocol_bs.read_request
  in
  match request with `Greeting {name; _} -> Js.log ("Hi " ^ name ^ "!")


(** Serialize [request] as JSON *)
let () =
  let request =
    `Greeting
      { Protocol_t.name = "Turner"
      ; age = 33
      ; student = false
      ; pet = Some (`Dog "Hooch") }
  in
  request
  |> Atdgen_codec_runtime.Encode.encode Protocol_bs.write_request
  |> Json.stringify
  |> Js.log2 "JSON:"

Reason

/** Parse JSON string */
let () = {
  let request =
    {| ["Greeting",{"name":"Turner","age":33,"pet":["Dog","Hooch"]}] |}
    |> Json.parseOrRaise
    |> Atdgen_codec_runtime.Decode.decode(Protocol_bs.read_request);

  switch (request) {
  | `Greeting({name, _}) => Js.log("Hi " ++ name ++ "!")
  };
};

/** Serialize [request] as JSON */

let () = {
  let request =
    `Greeting({
      Protocol_t.name: "Turner",
      age: 33,
      student: false,
      pet: Some(`Dog("Hooch")),
    });

  request
  |> Atdgen_codec_runtime.Encode.encode(Protocol_bs.write_request)
  |> Json.stringify
  |> Js.log2("JSON:");
};