rdf_types/dataset/
fallible.rs1use crate::{pattern::CanonicalQuadPattern, utils::InfallibleIterator, Quad, Triple};
2
3use super::{Dataset, DatasetMut, PatternMatchingDataset, TraversableDataset};
4
5pub trait FallibleDataset {
7 type Resource;
9
10 type Error;
12}
13
14impl<D: Dataset> FallibleDataset for D {
15 type Resource = D::Resource;
16 type Error = std::convert::Infallible;
17}
18
19pub trait FallibleTraversableDataset: FallibleDataset {
21 type TryQuads<'a>: Iterator<Item = Result<Quad<&'a Self::Resource>, Self::Error>>
23 where
24 Self: 'a;
25
26 fn try_quads(&self) -> Self::TryQuads<'_>;
27}
28
29impl<D: TraversableDataset> FallibleTraversableDataset for D {
30 type TryQuads<'a>
31 = InfallibleIterator<D::Quads<'a>>
32 where
33 Self: 'a;
34
35 fn try_quads(&self) -> Self::TryQuads<'_> {
36 InfallibleIterator(self.quads())
37 }
38}
39
40pub trait FalliblePatternMatchingDataset: FallibleDataset {
42 type TryQuadPatternMatching<'a, 'p>: Iterator<
43 Item = Result<Quad<&'a Self::Resource>, Self::Error>,
44 >
45 where
46 Self: 'a,
47 Self::Resource: 'p;
48
49 fn try_quad_pattern_matching<'p>(
50 &self,
51 pattern: CanonicalQuadPattern<&'p Self::Resource>,
52 ) -> Self::TryQuadPatternMatching<'_, 'p>;
53
54 fn try_contains_triple(&self, triple: Triple<&Self::Resource>) -> Result<bool, Self::Error> {
55 Ok(self
56 .try_quad_pattern_matching(triple.into())
57 .next()
58 .transpose()?
59 .is_some())
60 }
61}
62
63impl<D: PatternMatchingDataset> FalliblePatternMatchingDataset for D {
64 type TryQuadPatternMatching<'a, 'p>
65 = InfallibleIterator<D::QuadPatternMatching<'a, 'p>>
66 where
67 Self: 'a,
68 Self::Resource: 'p;
69
70 fn try_quad_pattern_matching<'p>(
71 &self,
72 pattern: CanonicalQuadPattern<&'p Self::Resource>,
73 ) -> Self::TryQuadPatternMatching<'_, 'p> {
74 InfallibleIterator(self.quad_pattern_matching(pattern))
75 }
76}
77
78pub trait FallibleDatasetMut: FallibleDataset {
80 fn try_insert(&mut self, quad: Quad<Self::Resource>) -> Result<(), Self::Error>;
81}
82
83impl<D: DatasetMut> FallibleDatasetMut for D {
84 fn try_insert(&mut self, quad: Quad<Self::Resource>) -> Result<(), Self::Error> {
85 self.insert(quad);
86 Ok(())
87 }
88}