GithubHelp home page GithubHelp logo

isabella232 / ion-schema-rust Goto Github PK

View Code? Open in Web Editor NEW

This project forked from amazon-ion/ion-schema-rust

0.0 0.0 0.0 147 KB

Rust implementation of Ion Schema

License: Apache License 2.0

Rust 100.00%

ion-schema-rust's Introduction

Amazon Ion Schema Rust

Crate Docs License Rust

An implementation of Amazon Ion Schema in Rust.

This package is considered experimental, under active/early development, and the API is subject to change.

Getting Started

The following rust code sample is a simple example of how to use this API.

Example schema my_schema.isl

This file (my_schema.isl) defines a new type (my_int_type) based on Ion's int type.

schema_header::{
  imports: [],
}

type::{
  name: my_int_type,
  type: int,
}

schema_footer::{
}

Loading a schema and validating an Ion value

use ion_schema::authority::{DocumentAuthority, FileSystemDocumentAuthority};
use ion_schema::external::ion_rs::value::owned::OwnedElement;
use ion_schema::result::{ValidationResult, IonSchemaResult};
use ion_schema::types::TypeRef;
use ion_schema::schema::Schema;
use ion_schema::system::SchemaSystem;
use std::path::Path;
use std::rc::Rc;

fn main() -> IonSchemaResult<()> {
    // Create authorities vector containing all the authorities that will be used to load a schema based on schema id
    let document_authorities: Vec<Box<dyn DocumentAuthority>> = vec![Box::new(
        FileSystemDocumentAuthority::new(Path::new("schema")), // provide a path to the authority base folder containing schemas
    )];

    // Create a new schema system from given document authorities
    let mut schema_system = SchemaSystem::new(document_authorities);

    // Provide schema id for the schema you want to load (schema_id is the schema file name here)
    let schema_id = "my_schema.isl";

    // Load schema
    let schema: Rc<Schema> = schema_system.load_schema(schema_id)?;

    // Retrieve a particular type from this schema
    let type_ref: TypeRef = schema.get_type("my_int_type").unwrap();

    // Validate data based on the type: 'my_int_type'
    check_value(5.into(), &type_ref); // this validation passes as the value satisfies integer type constraint
    check_value(5e3.into(), &type_ref); // this returns violation as 'my_int_type' expects an integer value

    Ok(())
}

// Verify if the given value is valid and print violation for invalid value
fn check_value(value: OwnedElement, type_ref: &TypeRef) {
    let validation_result: ValidationResult = type_ref.validate(&value);
    if let Err(violation) = validation_result {
        println!("{:?}", value);
        println!("{:#?}", violation);
    }
}

Output

When run, the code above produces the following output:

OwnedElement { annotations: [], value: Float(5000.0) }
Violation {
    constraint: "my_int_type",
    code: TypeConstraintsUnsatisfied,
    message: "value didn't satisfy type constraint(s)",
    violations: [
        Violation {
            constraint: "type_constraint",
            code: TypeMismatched,
            message: "expected type Integer, found Float",
            violations: [],
        },
    ],
}

Development

This repository contains git submodules called ion-schema-schemas and ion-schema-tests, which holds test data used by this library's unit tests.

The easiest way to clone the ion-schema-rust repository and initialize its submodules is to run the following command:

$ git clone --recursive https://github.com/amzn/ion-schema-rust.git ion-schema-rust

Alternatively, the submodule may be initialized independently from the clone by running the following commands:

$ git submodule init
$ git submodule update

Building the project,

$ cargo build --workspace --all-targets

Running all tests for ion-schema-rust,

$ cargo test --workspace

Examples

The repository contains an examples/ folder which is a CLI tool to load and validate schema.

To load a schema using the examples CLI:

$ cargo run --package ion-schema --example schema load --directory <DIRECTORY> --schema <SCHEMA_FILE> 

To validate an ion value against a schema type using the examples CLI:

$ cargo run --package ion-schema --example schema validate --directory <DIRECTORY> --schema <SCHEMA_FILE> --input <INPUT_FILE> --type <TYPE>

For more information on how to use the examples CLI, run the following command:

$ cargo run --package ion-schema --example schema help  

License

This library is licensed under the Apache-2.0 License.

ion-schema-rust's People

Contributors

amazon-auto avatar desaikd avatar zslayton avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.