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 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 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}