standard_schema 0.0.1 copy "standard_schema: ^0.0.1" to clipboard
standard_schema: ^0.0.1 copied to clipboard

Vendor-neutral Standard Schema contracts for Dart validators and JSON Schema converters.

example/standard_schema_example.dart

import 'package:standard_schema/standard_schema.dart';
import 'package:standard_schema/utils.dart';

final class RequiredStringSchema implements StandardSchemaV1<Object?, String> {
  const RequiredStringSchema();

  @override
  StandardSchemaPropsV1<Object?, String> get standard => StandardSchemaPropsV1(
    vendor: 'example',
    validate: (value, [options]) {
      if (value is String && value.isNotEmpty) {
        return StandardSuccess(value);
      }

      return StandardFailure([
        StandardIssue(
          message: 'Expected a non-empty string',
          path: ['user', 'name'],
        ),
      ]);
    },
  );
}

final class StringToIntSchema implements StandardSchemaV1<Object?, int> {
  const StringToIntSchema();

  @override
  StandardSchemaPropsV1<Object?, int> get standard => StandardSchemaPropsV1(
    vendor: 'example',
    validate: (value, [options]) {
      if (value is String) {
        final parsed = int.tryParse(value);
        if (parsed != null) {
          return StandardSuccess(parsed);
        }
      }

      return StandardFailure([
        StandardIssue(message: 'Expected an integer string', path: ['age']),
      ]);
    },
  );
}

final class RequiredStringWithJsonSchema
    implements StandardSchemaWithJsonSchemaV1<Object?, String> {
  const RequiredStringWithJsonSchema();

  @override
  StandardSchemaWithJsonSchemaPropsV1<Object?, String> get standard =>
      StandardSchemaWithJsonSchemaPropsV1(
        vendor: 'example',
        validate: const RequiredStringSchema().standard.validate,
        jsonSchema: StandardJsonSchemaConverter(
          input: (options) => {
            r'$schema': options.target,
            'type': 'string',
            'minLength': 1,
          },
          output: (options) => {'type': 'string', 'minLength': 1},
        ),
      );
}

Future<void> main() async {
  final name = await validateInput(const RequiredStringSchema(), 'Ada');
  final age = await validateInput(const StringToIntSchema(), '42');
  print('Validated: $name is $age');

  final schema = const RequiredStringWithJsonSchema();
  print(modelInputSchema(schema));

  try {
    await validateInput(schema, '');
  } on SchemaError catch (error) {
    for (final issue in error.issues) {
      final path = getDotPath(issue) ?? '<root>';
      print('$path: ${issue.message}');
    }
  }
}

Future<Output> validateInput<Input, Output>(
  StandardSchemaV1<Input, Output> schema,
  Object? value,
) async {
  final result = await Future.value(schema.standard.validate(value));

  return switch (result) {
    StandardSuccess(value: final output) => output,
    StandardFailure(issues: final issues) => throw SchemaError(issues),
  };
}

Map<String, Object?> modelInputSchema<Input, Output>(
  StandardJsonSchemaV1<Input, Output> schema,
) {
  return schema.standard.jsonSchema.input(
    const StandardJsonSchemaOptions(target: JsonSchemaTarget.draft202012),
  );
}
0
likes
160
points
21
downloads

Documentation

API reference

Publisher

verified publisherleoafarias.com

Weekly Downloads

Vendor-neutral Standard Schema contracts for Dart validators and JSON Schema converters.

Repository (GitHub)
View/report issues
Contributing

Topics

#validation #schema #json-schema #interoperability #standard-schema

License

BSD-3-Clause (license)

More

Packages that depend on standard_schema