shacl_ast/converter/shacl_to_rdf/
shacl_writer.rs

1use crate::{Schema, SH_STR};
2use iri_s::IriS;
3use srdf::{RDFFormat, SRDFBuilder, RDF, XSD};
4use std::io::Write;
5use std::str::FromStr;
6
7pub struct ShaclWriter<RDF>
8where
9    RDF: SRDFBuilder,
10{
11    rdf: RDF,
12}
13
14impl<RDF> ShaclWriter<RDF>
15where
16    RDF: SRDFBuilder,
17{
18    pub fn new() -> Self {
19        Self { rdf: RDF::empty() }
20    }
21
22    pub fn write(&mut self, schema: &Schema) -> Result<(), RDF::Err> {
23        let mut prefix_map = schema.prefix_map();
24        let _ = prefix_map.insert("rdf", &IriS::from_str(RDF).unwrap());
25        let _ = prefix_map.insert("xsd", &IriS::from_str(XSD).unwrap());
26        let _ = prefix_map.insert("sh", &IriS::from_str(SH_STR).unwrap());
27
28        self.rdf.add_prefix_map(prefix_map)?;
29        self.rdf.add_base(&schema.base())?;
30
31        schema
32            .iter()
33            .try_for_each(|(_, shape)| shape.write(&mut self.rdf))?;
34
35        Ok(())
36    }
37
38    pub fn serialize<W: Write>(&self, format: &RDFFormat, writer: &mut W) -> Result<(), RDF::Err> {
39        self.rdf.serialize(format, writer)
40    }
41}
42
43impl<RDF> Default for ShaclWriter<RDF>
44where
45    RDF: SRDFBuilder,
46{
47    fn default() -> Self {
48        Self::new()
49    }
50}