11个重大版本

新功能 0.12.0 2024年8月23日
0.11.0 2024年3月11日
0.10.0 2023年11月2日
0.9.1 2023年6月29日
0.1.0 2021年12月17日

#218 in 数据库接口

Download history 47/week @ 2024-05-03 31/week @ 2024-05-10 29/week @ 2024-05-17 33/week @ 2024-05-24 274/week @ 2024-05-31 127/week @ 2024-06-07 48/week @ 2024-06-14 51/week @ 2024-06-21 123/week @ 2024-06-28 63/week @ 2024-07-05 76/week @ 2024-07-12 47/week @ 2024-07-19 54/week @ 2024-07-26 56/week @ 2024-08-02 35/week @ 2024-08-09 18/week @ 2024-08-16

166 每月下载量
用于 ion-cli

Apache-2.0

495KB
10K SLoC

Amazon Ion Schema Rust

Crate Docs License Rust

Rust中Amazon Ion Schema的实现。

如果您想尝试使用 ion-schema-rust 验证您的Ion值,请访问: https://amazon-ion.github.io/ion-schema/sandbox

此包被认为是实验性的,处于积极/早期开发阶段,API可能会更改。

入门指南

以下rust代码示例是使用此API的简单示例。

示例模式 my_schema.isl

此文件 (my_schema.isl) 定义了一个基于Ion的 int 类型的新的类型 (my_int_type)。

schema_header::{
  imports: [],
}

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

schema_footer::{
}

加载模式和验证Ion值

use ion_rs::element::Element;
use ion_schema::authority::{DocumentAuthority, FileSystemDocumentAuthority};
use ion_schema::result::{IonSchemaResult, ValidationResult};
use ion_schema::schema::Schema;
use ion_schema::system::SchemaSystem;
use ion_schema::types::TypeDefinition;
use ion_schema::IonSchemaElement;
use std::fmt::Debug;
use std::path::Path;
use std::sync::Arc;

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("schemas")), // 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: Arc<Schema> = schema_system.load_schema(schema_id)?;

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

    let valid_element: Element = 5.into();
    let invalid_element: Element = 5e3.into();
    let invalid_document_element: Vec<Element> = vec![5.into(), true.into(), 6e3.into()];

    // Validate data based on the type: 'my_int_type'
    check_value(&valid_element, &type_ref); // this validation passes as the value satisfies integer type constraint
    check_value(&invalid_element, &type_ref); // this returns violation as 'my_int_type' expects an integer value
    check_value(&invalid_document_element, &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<I: Into<IonSchemaElement> + Debug + Clone>(value: I, type_ref: &TypeDefinition) {
    let validation_result: ValidationResult = type_ref.validate(value.to_owned());
    if let Err(violation) = validation_result {
        println!("{}", value.into());
        println!("{:#?}", violation);
    }
}

输出

运行上述代码将产生以下输出

5e3
Violation {
    constraint: "my_int_type",
    code: TypeConstraintsUnsatisfied,
    message: "value didn't satisfy type constraint(s)",
    ion_path: (),
    violations: [
        Violation {
            constraint: "type_constraint",
            code: TypeMismatched,
            message: "expected type Int, found Float",
            ion_path: (),
            violations: [],
        },
    ],
}
/* Ion document */ 5 true 6e3 /* end */
Violation {
    constraint: "my_int_type",
    code: TypeConstraintsUnsatisfied,
    message: "value didn't satisfy type constraint(s)",
    ion_path: (),
    violations: [
        Violation {
            constraint: "type_constraint",
            code: TypeMismatched,
            message: "expected type Int, found document",
            ion_path: (),
            violations: [],
        },
    ],
}

有关更多入门示例,请访问: https://amazon-ion.github.io/ion-schema/docs/cookbook/ion-schema-rust-getting-started

开发

此存储库包含名为 ion-schema-schemasion-schema-testsgit子模块,它们包含此库单元测试使用的测试数据。

克隆 ion-schema-rust 存储库并初始化其子模块的最简单方法是运行以下命令

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

或者,可以独立于克隆运行以下命令来初始化子模块

$ git submodule init
$ git submodule update

构建项目

$ cargo build --workspace --all-targets

运行 ion-schema-rust 的所有测试

$ cargo test --workspace

示例

存储库包含一个 examples/ 文件夹,该文件夹是一个用于加载和验证模式的CLI工具。

使用示例CLI加载模式

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

使用examples CLI验证离子值与模式类型

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

有关如何使用examples CLI的更多信息,请运行以下命令

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

许可证

此库采用Apache-2.0许可证。

依赖项

约8-15MB
~191K SLoC