shacl_ast/converter/shacl_to_rdf/
shacl_writer.rs1use 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}