shacl_ast/compiled/
node_shape.rs1use 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 deactivated: bool,
24 severity: Option<CompiledSeverity<S>>,
26 }
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}