Thanks to visit codestin.com
Credit goes to hexdocs.pm

castor

Work with JSON Schema in Gleam. Supports building schemas as well as encoding decoding from json schema file.

Package Version Hex Docs

gleam add castor@1

Build schemas

Build schemas using the castor helper function. Serialize via JSON

import castor

pub fn simple_schema() {
  castor.boolean()
  |> castor.encode
  |> json.to_string
  // "{"type":"boolean","nullable":false,"deprecated":false}"
}

pub fn list_schema()  {
  castor.array(castor.Inline(castor.integer()))
  |> castor.encode
  |> json.to_string
  |> io.println
  // {"type":"array","uniqueItems":false,"items":{"type":"integer","nullable":false,"deprecated":false},"nullable":false,"deprecated":false}
}

Create record with either required or optional fields

import castor

pub fn object_schema() {
  castor.object([
    castor.field("age", castor.integer()),
    castor.optional_field("nickname", castor.string()),
  ])
  |> castor.encode
  |> json.to_string
  == "{\"type\":\"object\",\"properties\":{\"nickname\":{\"type\":\"string\",\"nullable\":false,\"deprecated\":false},\"age\":{\"type\":\"integer\",\"nullable\":false,\"deprecated\":false}},\"minProperties\":0,\"required\":[\"age\"],\"nullable\":false,\"deprecated\":false}"
}

To add other schema information such as maximum and minimum use the schema objects directly.

```gleam
import castor

pub fn number_schema() {
  castor.Integer(
    multiple_of: None,
    maximum: Some(100),
    exclusive_maximum: None,
    minimum: Some(25),
    exclusive_minimum: None,
    nullable: False,
    title: Some("bigish number"),
    description: Some("A two digit number bigger that"),
    deprecated: True,
  )
  |> castor.encode
  |> json.to_string
  == "{\"type\":\"integer\",\"maximum\":100,\"minimum\":25,\"nullable\":false,\"title\":\"bigish number\",\"description\":\"A two digit number bigger that\",\"deprecated\":true}"
}

OAS generator

Manually writing encoders and decoders can be tedious. Check out oas_generator to derive encodes and decoders from schema.

Decoding schemas

Use the decoder to decode a schema

import gleam/json
import castor

pub fn decode(){
  "{\"type\":\"boolean\",\"nullable\":false,\"deprecated\":false}"
  |> json.parse(castor.decoder())
  == Ok(castor.Boolean(False, None, None, False))
}

Further documentation can be found at https://hexdocs.pm/castor.

Development

gleam run   # Run the project
gleam test  # Run the tests

Notes

This currently depends on oas_generator_utils. The Any type defined there is for decoded and introspectable JSON. I would like to not depend on this but probably requires some parameterised versions of the decoder.

Credit

Created for EYG, a new integration focused programming language.

Codestin Search App Codestin Search App