shacl_ast/ast/
target.rs

1use std::fmt::Display;
2
3use crate::{SH_TARGET_CLASS, SH_TARGET_NODE};
4use prefixmap::IriRef;
5use srdf::{RDFNode, SRDFBuilder, RDF_TYPE};
6
7#[derive(Debug, Clone)]
8pub enum Target {
9    TargetNode(RDFNode),
10    TargetClass(RDFNode),
11    TargetSubjectsOf(IriRef),
12    TargetObjectsOf(IriRef),
13    TargetImplicitClass(RDFNode),
14}
15
16impl Target {
17    // TODO: this is a bit ugly
18    pub fn write<RDF>(&self, rdf_node: &RDFNode, rdf: &mut RDF) -> Result<(), RDF::Err>
19    where
20        RDF: SRDFBuilder,
21    {
22        let node: RDF::Subject = rdf_node.clone().try_into().map_err(|_| unreachable!())?;
23        match self {
24            Self::TargetNode(target_rdf_node) => {
25                rdf.add_triple(node, SH_TARGET_NODE.clone(), target_rdf_node.clone())
26            }
27            Self::TargetClass(target_rdf_node) => {
28                rdf.add_triple(node, SH_TARGET_CLASS.clone(), target_rdf_node.clone())
29            }
30            Self::TargetSubjectsOf(iri_ref) => rdf.add_triple(
31                node,
32                SH_TARGET_CLASS.clone(),
33                iri_ref.get_iri().unwrap().clone(),
34            ),
35            Self::TargetObjectsOf(iri_ref) => rdf.add_triple(
36                node,
37                SH_TARGET_CLASS.clone(),
38                iri_ref.get_iri().unwrap().clone(),
39            ),
40            // TODO: check if this is fine
41            Self::TargetImplicitClass(target_rdf_node) => {
42                rdf.add_triple(node, RDF_TYPE.clone(), target_rdf_node.clone())
43            }
44        }
45    }
46}
47impl Display for Target {
48    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49        match self {
50            Target::TargetNode(node) => write!(f, "targetNode({node})"),
51            Target::TargetClass(node) => write!(f, "targetClass({node})"),
52            Target::TargetSubjectsOf(node) => write!(f, "targetSubjectsOf({node})"),
53            Target::TargetObjectsOf(node) => write!(f, "targetObjectsOf({node})"),
54            Target::TargetImplicitClass(node) => write!(f, "targetImplicitClass({node})"),
55        }
56    }
57}