shacl_ast/compiled/
node_shape.rs

1use std::collections::HashSet;
2
3use srdf::Rdf;
4
5use crate::node_shape::NodeShape;
6use crate::Schema;
7
8use super::compile_shape;
9use super::compiled_shacl_error::CompiledShaclError;
10use super::component::CompiledComponent;
11use super::severity::CompiledSeverity;
12use super::shape::CompiledShape;
13use super::target::CompiledTarget;
14
15#[derive(Debug)]
16pub struct CompiledNodeShape<S: Rdf> {
17    id: S::Term,
18    components: Vec<CompiledComponent<S>>,
19    targets: Vec<CompiledTarget<S>>,
20    property_shapes: Vec<CompiledShape<S>>,
21    closed: bool,
22    // ignored_properties: Vec<S::IRI>,
23    deactivated: bool,
24    // message: MessageMap,
25    severity: Option<CompiledSeverity<S>>,
26    // name: MessageMap,
27    // description: MessageMap,
28    // group: S::Term,
29    // source_iri: S::IRI,
30}
31
32impl<S: Rdf> CompiledNodeShape<S> {
33    pub fn new(
34        id: S::Term,
35        components: Vec<CompiledComponent<S>>,
36        targets: Vec<CompiledTarget<S>>,
37        property_shapes: Vec<CompiledShape<S>>,
38        closed: bool,
39        deactivated: bool,
40        severity: Option<CompiledSeverity<S>>,
41    ) -> Self {
42        CompiledNodeShape {
43            id,
44            components,
45            targets,
46            property_shapes,
47            closed,
48            deactivated,
49            severity,
50        }
51    }
52
53    pub fn id(&self) -> &S::Term {
54        &self.id
55    }
56
57    pub fn is_deactivated(&self) -> &bool {
58        &self.deactivated
59    }
60
61    pub fn severity(&self) -> &CompiledSeverity<S> {
62        match &self.severity {
63            Some(severity) => severity,
64            None => &CompiledSeverity::Violation,
65        }
66    }
67
68    pub fn components(&self) -> &Vec<CompiledComponent<S>> {
69        &self.components
70    }
71
72    pub fn targets(&self) -> &Vec<CompiledTarget<S>> {
73        &self.targets
74    }
75
76    pub fn property_shapes(&self) -> &Vec<CompiledShape<S>> {
77        &self.property_shapes
78    }
79
80    pub fn closed(&self) -> &bool {
81        &self.closed
82    }
83}
84
85impl<S: Rdf> CompiledNodeShape<S> {
86    pub fn compile(shape: Box<NodeShape>, schema: &Schema) -> Result<Self, CompiledShaclError> {
87        let id = shape.id().clone().into();
88        let closed = shape.is_closed().to_owned();
89        let deactivated = shape.is_deactivated().to_owned();
90        let severity = CompiledSeverity::compile(shape.severity())?;
91
92        let components = shape.components().iter().collect::<HashSet<_>>();
93        let mut compiled_components = Vec::new();
94        for component in components {
95            let component = CompiledComponent::compile(component.to_owned(), schema)?;
96            compiled_components.push(component);
97        }
98
99        let mut targets = Vec::new();
100        for target in shape.targets() {
101            let ans = CompiledTarget::compile(target.to_owned())?;
102            targets.push(ans);
103        }
104
105        let mut property_shapes = Vec::new();
106        for property_shape in shape.property_shapes() {
107            let shape = compile_shape(property_shape.to_owned(), schema)?;
108            property_shapes.push(shape);
109        }
110
111        let compiled_node_shape = CompiledNodeShape::new(
112            id,
113            compiled_components,
114            targets,
115            property_shapes,
116            closed,
117            deactivated,
118            severity,
119        );
120
121        Ok(compiled_node_shape)
122    }
123}