Skip to main content

linked_data/ser/
quads.rs

1use rdf_syntax::{
2	ConstGenDomain, GenInterpretation, GroundInterpretation, InterpretationMut, Quad, Term,
3	generator::BlankIdGenerator,
4};
5
6use crate::{LinkedDataSerializer, SerializeLinkedData, ser::SerializeLinkedDataWith};
7
8pub struct QuadSerializer<I: GroundInterpretation = GenInterpretation<BlankIdGenerator>> {
9	interpretation: I,
10	quads: Vec<Quad<I::Resource>>,
11}
12
13impl<I: GroundInterpretation> QuadSerializer<I> {
14	pub fn new(interpretation: I) -> Self {
15		Self {
16			interpretation,
17			quads: Vec::new(),
18		}
19	}
20}
21
22#[derive(Debug, thiserror::Error)]
23pub enum QuadSerializationFailed<R = Term> {
24	#[error("ambiguous resource")]
25	AmbiguousResource(R),
26
27	#[error("{0}")]
28	Other(String),
29}
30
31impl<R: Clone> super::Error<R> for QuadSerializationFailed<R> {
32	fn ambiguous_resource(r: &R) -> Self {
33		Self::AmbiguousResource(r.clone())
34	}
35
36	fn custom(str: impl ToString) -> Self {
37		Self::Other(str.to_string())
38	}
39}
40
41impl<I> LinkedDataSerializer<I::Resource> for QuadSerializer<I>
42where
43	I: InterpretationMut + ConstGenDomain,
44	I::Resource: Clone + Ord,
45{
46	type Error = QuadSerializationFailed<I::Resource>;
47	type Ok = Vec<Quad<I::Resource>>;
48
49	fn interpret(&mut self, term: Option<rdf_syntax::CowTerm>) -> Result<I::Resource, Self::Error> {
50		match term {
51			Some(term) => Ok(self.interpretation.insert_term(term)),
52			None => Ok(self.interpretation.new_resource()),
53		}
54	}
55
56	fn serialize_resource(
57		&mut self,
58		resource: Option<I::Resource>,
59	) -> Result<I::Resource, Self::Error> {
60		match resource {
61			Some(r) => Ok(r),
62			None => Ok(self.interpretation.new_resource()),
63		}
64	}
65
66	fn serialize_quad(&mut self, quad: Quad<I::Resource>) -> Result<(), Self::Error> {
67		self.quads.push(quad);
68		Ok(())
69	}
70
71	fn end(self) -> Result<Self::Ok, Self::Error> {
72		Ok(self.quads)
73	}
74}
75
76/// Serializes the given value to RDF quads.
77pub fn to_rdf_quads(
78	value: impl SerializeLinkedData,
79) -> Result<Vec<Quad<Term>>, QuadSerializationFailed> {
80	value.serialize_rdf(
81		QuadSerializer::new(GenInterpretation::new(BlankIdGenerator::new())),
82		None,
83	)
84}
85
86/// Serializes the given value to RDF quads, using the given state.
87pub fn to_rdf_quads_with<Q>(
88	value: impl SerializeLinkedDataWith<Q>,
89	state: Q,
90) -> Result<Vec<Quad<Term>>, QuadSerializationFailed> {
91	value.serialize_rdf_with(
92		state,
93		QuadSerializer::new(GenInterpretation::new(BlankIdGenerator::new())),
94		None,
95	)
96}
97
98/// Serializes the given value to RDF quads, using a custom interpretation.
99pub fn to_rdf_quads_interpretation<I>(
100	value: impl SerializeLinkedData<I::Resource>,
101	interpretation: I,
102) -> Result<Vec<Quad<I::Resource>>, QuadSerializationFailed<I::Resource>>
103where
104	I: InterpretationMut + ConstGenDomain,
105	I::Resource: Clone + Ord,
106{
107	value.serialize_rdf(QuadSerializer::new(interpretation), None)
108}
109
110/// Serializes the given value to RDF quads, using a custom interpretation.
111pub fn to_rdf_quads_interpretation_with<Q, I>(
112	value: impl SerializeLinkedDataWith<Q, I::Resource>,
113	interpretation: I,
114	state: Q,
115) -> Result<Vec<Quad<I::Resource>>, QuadSerializationFailed<I::Resource>>
116where
117	I: InterpretationMut + ConstGenDomain,
118	I::Resource: Clone + Ord,
119{
120	value.serialize_rdf_with(state, QuadSerializer::new(interpretation), None)
121}