linked_data/de/
dataset.rs1use 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}