Skip to main content

linked_data/de/
dataset.rs

1use rdf_syntax::{
2	CowTerm, PatternMatchingDatasetMut, Quad, TryInterpretationMut, TryReverseInterpretation,
3	pattern::LinearQuadPattern,
4};
5
6use crate::LinkedDataDeserializer;
7
8pub struct DatasetDeserializer<D, I> {
9	dataset: D,
10	interpretation: I,
11}
12
13impl<D, I> DatasetDeserializer<D, I> {
14	pub fn new(dataset: D, interpretation: I) -> Self {
15		Self {
16			dataset,
17			interpretation,
18		}
19	}
20}
21
22impl<D, I> LinkedDataDeserializer<I::Resource> for DatasetDeserializer<D, I>
23where
24	D: PatternMatchingDatasetMut<Resource = I::Resource>,
25	I: TryReverseInterpretation + TryInterpretationMut,
26	I::Resource: Clone,
27{
28	type Error = DatasetDeserializerError;
29
30	fn interpret(&mut self, term: CowTerm) -> Result<I::Resource, Self::Error> {
31		self.interpretation
32			.try_insert_term(term)
33			.map_err(|e| DatasetDeserializerError(e.to_string()))
34	}
35
36	fn terms_of<'a>(
37		&'a self,
38		resource: &'a I::Resource,
39	) -> Result<impl Iterator<Item = Result<CowTerm<'a>, Self::Error>>, Self::Error> {
40		Ok(self
41			.interpretation
42			.try_terms_of(resource)
43			.map_err(DatasetDeserializerError::new)?
44			.map(|r| r.map(Into::into).map_err(DatasetDeserializerError::new)))
45	}
46
47	fn peek_resources<'a>(
48		&'a self,
49	) -> Result<impl Iterator<Item = Result<&'a I::Resource, Self::Error>>, Self::Error>
50	where
51		I::Resource: 'a,
52	{
53		Ok(std::iter::empty())
54	}
55
56	fn deserialize_resource(
57		&mut self,
58		resource: Option<I::Resource>,
59	) -> Result<Option<I::Resource>, Self::Error> {
60		match resource {
61			Some(r) => Err(super::Error::unexpected_resource(&r)),
62			None => Ok(None),
63		}
64	}
65
66	fn peek_quads<'p>(
67		&'p self,
68		pattern: impl Into<LinearQuadPattern<&'p I::Resource>>,
69	) -> Result<impl Iterator<Item = Result<Quad<&'p I::Resource>, Self::Error>>, Self::Error>
70	where
71		I::Resource: 'p,
72	{
73		Ok(self.dataset.quad_pattern_matching(pattern.into()).map(Ok))
74	}
75
76	fn deserialize_quad<'p>(
77		&mut self,
78		pattern: impl Into<LinearQuadPattern<&'p I::Resource>>,
79	) -> Result<Option<Quad<I::Resource>>, Self::Error>
80	where
81		I::Resource: 'p,
82	{
83		Ok(self.dataset.extract_matching_quads(pattern).next())
84	}
85}
86
87#[derive(Debug, thiserror::Error)]
88#[error("{0}")]
89pub struct DatasetDeserializerError(pub String);
90
91impl DatasetDeserializerError {
92	pub fn new(e: impl ToString) -> Self {
93		Self(e.to_string())
94	}
95}
96
97impl<R> crate::de::Error<R> for DatasetDeserializerError {
98	fn custom(e: impl ToString) -> Self {
99		Self(e.to_string())
100	}
101}