use crate::rule::Rule;
use crate::selector::Selector;
use crate::shape::{ShapeArena, ShapeId};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Statement {
pub selector: Selector,
pub shape: ShapeId,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Schema {
pub arena: ShapeArena,
pub statements: Vec<Statement>,
pub rules: Vec<Rule>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub names: HashMap<ShapeId, String>,
}
impl Schema {
pub fn new() -> Self {
Self::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::path::Path;
use crate::shape::Shape;
use crate::term::{NamedNode, NodeKindSet};
#[test]
fn schema_serde_roundtrip_with_cycle() {
let mut schema = Schema::new();
let knows = NamedNode::new("http://ex/knows").unwrap();
let s = schema.arena.reserve();
let kind = schema.arena.insert(Shape::TestKind(NodeKindSet::IRI));
let reaches = schema.arena.insert(Shape::Count {
path: Path::Pred(knows.clone()),
min: Some(1),
max: None,
qualifier: s,
});
schema.arena.set(s, Shape::And(vec![kind, reaches]));
schema.statements.push(Statement {
selector: Selector::HasOut(knows),
shape: s,
});
let json = serde_json::to_string(&schema).unwrap();
let back: Schema = serde_json::from_str(&json).unwrap();
assert_eq!(schema, back);
}
}