use crate::path::Path;
use crate::shape::ShapeId;
use crate::term::{NamedNode, Term};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NodeExpr {
This,
Constant(Term),
Path(Path),
Filter {
input: Box<NodeExpr>,
shape: ShapeId,
},
Intersection(Vec<NodeExpr>),
Union(Vec<NodeExpr>),
Function { iri: NamedNode, args: Vec<NodeExpr> },
}
impl NodeExpr {
pub fn referenced_shapes(&self, out: &mut Vec<ShapeId>) {
match self {
NodeExpr::Filter { input, shape } => {
out.push(*shape);
input.referenced_shapes(out);
}
NodeExpr::Intersection(es) | NodeExpr::Union(es) => {
for e in es {
e.referenced_shapes(out);
}
}
NodeExpr::Function { args, .. } => {
for e in args {
e.referenced_shapes(out);
}
}
NodeExpr::This | NodeExpr::Constant(_) | NodeExpr::Path(_) => {}
}
}
}