mcpField
S
schemantic

schemantic

github.com/genkit-aiDevelopment17543 installsUpdated today
Repository

About schemantic

Schemantic is a Dart library for defining typed data classes linked to reusable runtime JSON schemas. It supports generated JSON conversion and validation, and can be used independently or with genkit-dart.

Key features

  1. 01Generated typed data classes
  2. 02JSON serialization and parsing
  3. 03Runtime JSON Schema access
  4. 04Dynamic primitive and collection schemas
  5. 05Union and recursive schemas

Use cases

  1. 01Parsing JSON into typed Dart objects
  2. 02Validating arbitrary JSON at runtime
  3. 03Sharing schemas across application logic

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/genkit-ai/genkit-dart --skill schemantic

After installing, type/schemanticin Claude Code to confirm it loaded.

Details

From the project README

Schemantic

Schemantic is a general-purpose Dart library used for defining strongly typed data classes that automatically bind to reusable runtime JSON schemas. It is standard for the genkit-dart framework but works independently as well.

Core Concepts

Always use schemantic when strongly typed JSON parsing or programmatic schema validation is required.

  • Annotate your abstract classes with @Schema().
  • Use the $ prefix for abstract schema class names (e.g., abstract class $User).
  • Always run dart run build_runner build to generate the .g.dart schema files.

Basic Usage

  1. Defining a schema:
import 'package:schemantic/schemantic.dart';

part 'my_file.g.dart'; // Must match the filename

@Schema()
abstract class $MyObj {
  String get name;
  $MySubObj get subObj;
}

@Schema()
abstract class $MySubObj {
  String get foo;
}
  1. Using the Generated Class:

The builder creates a concrete class MyObj (no $) with a factory constructor (MyObj.fromJson) and a regular constructor.

// Creating an instance
final obj = MyObj(name: 'test', subObj: MySubObj(foo: 'bar'));

// Serializing to JSON
print(obj.toJson()); 

// Parsing from JSON
final parsed = MyObj.fromJson({'name': 'test', 'subObj': {'foo': 'bar'}});
  1. Accessing Schemas at Runtime:

The generated data classes have a static $schema field (of type SchemanticType<T>) which can be used to pass the definition into functions or to extract the raw JSON schema.

// Access JSON schema
final schema = MyObj.$schema.jsonSchema;
print(schema.toJson());

// Validate arbitrary JSON at runtime
final validationErrors = await schema.validate({'invalid': 'data'});

Primitive Schemas

When a full data class is not required, Schemantic provides functions to create schemas dynamically.

final ageSchema = SchemanticType.integer(description: 'Age in years', minimum: 0);
final nameSchema = SchemanticType.string(minLength: 2);
final nothingSchema = SchemanticType.voidSchema();
final anySchema = SchemanticType.dynamicSchema();

final userSchema = SchemanticType.map(.string(), .integer()); // Map<String, int>
final tagsSchema = SchemanticType.list(.string()); // List<String>

Union Types (AnyOf)

To allow a field to accept multiple types, use @AnyOf.

@Schema()
abstract class $Poly {
  @AnyOf([int, String, $MyObj])
  Object? get id;
}

Schemantic generates a specific helper class (e.g., PolyId) to handle the values:

final poly1 = Poly(id: PolyId.int(123));
final poly2 = Poly(id: PolyId.string('abc'));

Field Annotations

You can use specialized annotations for more validation boundaries:

@Schema()
abstract class $User {
  @IntegerField(
    name: 'years_old', // Change JSON key
    description: 'Age of the user',
    minimum: 0,
    defaultValue: 18,
  )
  int? get age;

  @StringField(
    minLength: 2,
    enumValues: ['user', 'admin'], 
  )
  String get role;
}

Recursive Schemas

For recursive structures (like trees), must use useRefs: true inside the generated jsonSchema property. You define it normally:

@Schema()
abstract class $Node {
  String get id;
  List<$Node>? get children;
}

Note: Node.$schema.jsonSchema(useRefs: true) generates schemas with JSON Schema $ref.

Comments

Markdown supported