rdf_types/dataset/
fallible.rs

1use crate::{pattern::CanonicalQuadPattern, utils::InfallibleIterator, Quad, Triple};
2
3use super::{Dataset, DatasetMut, PatternMatchingDataset, TraversableDataset};
4
5/// Fallible dataset.
6pub trait FallibleDataset {
7	/// Resource type.
8	type Resource;
9
10	/// Error type.
11	type Error;
12}
13
14impl<D: Dataset> FallibleDataset for D {
15	type Resource = D::Resource;
16	type Error = std::convert::Infallible;
17}
18
19/// Fallible traversable dataset.
20pub trait FallibleTraversableDataset: FallibleDataset {
21	/// Fallible quads iterator.
22	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
40/// Pattern-matching-capable fallible dataset.
41pub 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
78/// Fallible mutable dataset.
79pub 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}