Rust Package & API Reference#

The Rust package (fair-data-schema crate or schemas/<version>/rust/src/lib.rs) provides auto-generated Rust data structures with serde serialization annotations.

Quick Example (Load, Validate, Save)#

use std::fs;
use serde_json::Result;
use fair_data_schema::DatasetSchema;

fn main() -> Result<()> {
    // 1. Load schema from disk
    let json_text = fs::read_to_string("my-schema.json").expect("Failed to read file");

    // 2. Validate & deserialize with serde
    let mut schema: DatasetSchema = serde_json::from_str(&json_text)?;
    println!("✓ Validated FAIR dataset title: {:?}", schema.node.title);

    // 3. Save modified schema to disk
    schema.node.title = Some("Updated FAIR Dataset 2024".to_string());
    let output_text = serde_json::to_string_pretty(&schema)?;
    fs::write("my-schema-output.json", output_text).expect("Failed to write file");

    Ok(())
}

Exported Enums#

I18nString#

Untagged enum for internationalized string fields (plain string vs BCP-47 language map).

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum I18nString {
    Text(String),
    Map(HashMap<String, String>),
}

I18nText#

Untagged enum for internationalized rich-text / Markdown fields.

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum I18nText {
    Text(String),
    Map(HashMap<String, String>),
}

JsonType#

Enum representing JSON Schema types.

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum JsonType {
    String,
    Integer,
    Number,
    Boolean,
    Array,
    Object,
    Null,
}

Exported Structs#

DatasetSchema#

Root-level FAIR dataset schema struct.

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct DatasetSchema {
    #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")]
    pub schema: Option<String>,

    #[serde(flatten)]
    pub node: SchemaNode,
}

SchemaNode#

Core schema node struct containing standard Draft 2020-12 keywords and fair: annotations mapped to fair_ field attributes.

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct SchemaNode {
    pub id: Option<String>,
    pub ref_uri: Option<String>,
    pub anchor: Option<String>,
    pub defs: Option<HashMap<String, SchemaNode>>,
    pub vocabulary: Option<HashMap<String, bool>>,
    pub comment: Option<String>,

    pub title: Option<String>,
    pub description: Option<String>,
    pub default: Option<serde_json::Value>,
    pub deprecated: Option<bool>,
    pub read_only: Option<bool>,
    pub write_only: Option<bool>,
    pub examples: Option<Vec<serde_json::Value>>,

    pub properties: Option<HashMap<String, SchemaNode>>,
    pub items: Option<Box<SchemaNode>>,
    pub prefix_items: Option<Vec<SchemaNode>>,
    pub all_of: Option<Vec<SchemaNode>>,
    pub any_of: Option<Vec<SchemaNode>>,
    pub one_of: Option<Vec<SchemaNode>>,

    // FAIR annotation fields
    pub fair_resource_type: Option<String>,
    pub fair_concept_ref: Option<String>,
    pub fair_concept: Option<I18nString>,
    pub fair_label: Option<I18nString>,
    pub fair_description: Option<I18nText>,
    pub fair_dataset_relations: Option<Vec<DatasetRelation>>,
    pub fair_contributors: Option<Vec<serde_json::Value>>,
    pub fair_provider: Option<I18nString>,
    pub fair_provider_ref: Option<String>,
    pub fair_license: Option<I18nString>,
    pub fair_license_ref: Option<String>,
    pub fair_temporal_coverage: Option<TemporalCoverage>,
    pub fair_spatial_coverage: Option<I18nString>,
    pub fair_population: Option<I18nString>,
    pub fair_structure_type: Option<String>,
    pub fair_quality: Option<Vec<serde_json::Value>>,
    pub fair_classification: Option<I18nString>,
    pub fair_measurement_unit: Option<I18nString>,
    pub fair_measurement_technique: Option<I18nString>,
    pub fair_quantity: Option<I18nString>,
    pub fair_unit_type: Option<I18nString>,
    pub fair_universe: Option<I18nString>,
    pub fair_sentinel: Option<bool>,
}

Helper Structs#

  • TemporalCoverage: pub description: Option<I18nString>, pub start: Option<String>, pub end: Option<String>.

  • DatasetRelation: pub relation_type: Option<String>, pub target_ref: Option<String>, pub source_variables: Option<Vec<String>>, pub target_variables: Option<Vec<String>>, pub cardinality: Option<String>, pub description: Option<I18nString>.