3 unstable releases

0.2.1 Aug 14, 2024
0.2.0 Aug 13, 2024
0.1.0 Aug 12, 2024

#1190 in Command line utilities

Download history 64/week @ 2024-08-06 286/week @ 2024-08-13 17/week @ 2024-09-10 11/week @ 2024-09-17 25/week @ 2024-09-24 4/week @ 2024-10-01

74 downloads per month

Apache-2.0

335KB
539 lines

JSON Schema DSL

A simple DSL to generate JSON Schema with one-liner style.

Why JSON Schema DSL?

  1. Make JSON Schema concise: JSON Schema DSL CLI

  2. AI friendly: Function calling, Structured Output with simple DSL: JSON Schema DSL CLI

  3. Schema friendly for CSV, Excel, Text2SQL: JSON Schema DSL CLI

Get Started

CLI: cargo install json-schema-dsl

$ json-schema-dsl "User{ id: int, name: string, email: Email}"

Output as following:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "User",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    }
  },
  "required": [
    "id",
    "name",
    "email"
  ]
}

Rust library: cargo add json-schema-dsl serde_json

fn main() {
    let struct_text = "User {id: int, name: string, email: Email}";
    let json_schema = json_schema_dsl::to_json_schema(struct_text).unwrap();
    println!("{}", serde_json::to_string_pretty(&json_schema).unwrap());
}

Syntax

JSON Schema DSL

User { id: int, name: string, birth_date: Date, email?: Email, tags: List<string>}

  • Object Name: starts with capital character, such as ObjectName { field: type }.
  • Field name: starts with lower-case character.
  • Optional field: field?: type

Basic Types

JSON Schema basic types:

  • string: aliases: varchar, Text, String, bytes or bytea(base64)
  • integer: aliases: int, bigint, long, serial, bigserial
  • number: aliases: float, double, real, decimal
  • boolean: aliases: bool

array Types

array type is alike List<T>, and T is a basic type or format name.

  • List: aliases: list
  • Array: aliases: array
  • Set(uniqueItems): aliases: set

object Type

Declare object type: field: ObjectName {field: type}.

Attention: ObjectName should start with Capital Character.

Formats

JSON Schema formats, and name should start with a capital letter:

  • Date
  • Time
  • Datetime
  • Timestamp
  • Interval
  • Duration
  • Email
  • Hostname
  • Ipv4
  • Ipv6
  • Uri
  • Hostname
  • Uuid or UUID
  • Json or JSON: JSON text
  • Xml or XML: XML text

Misc

  • range: age: int(18,), age: int(,150) or age: int(1,18)
  • string length range: nick: string(6,32), varchar(32)
  • array items length range: list<string>(2), list<float>(1536)
  • tuple: income: [int, string]
  • enum: enum('a', 'b', 'c') or enum(1, 2, 3)
  • regex: regex('^[a-z]+$')
  • anyOf: field: type1|type2, no space between types
  • additionalProperties: {field: type, ...}, ellipsis before }.

References

Dependencies

~2.8–4MB
~48K SLoC