Skip to main content

linked_data/de/
quads.rs

1use rdf_syntax::{
2	GenInterpretation, IndexedBTreeDataset, Quad, Term, TryInterpretationMut,
3	TryReverseInterpretation, generator::BlankIdGenerator,
4};
5
6use crate::{
7	DeserializeLinkedData,
8	de::{
9		DatasetDeserializer, DatasetDeserializerError, DeserializeLinkedDataWith,
10		ResourcesDeserializer,
11	},
12};
13
14pub type QuadsDeserializationFailed = DatasetDeserializerError;
15
16/// Deserializes an instance of `T` from the given quads.
17pub fn from_rdf_quads<T>(
18	quads: impl IntoIterator<Item = Quad<Term>>,
19	resources: impl IntoIterator<Item = Term>,
20) -> Result<T, QuadsDeserializationFailed>
21where
22	T: DeserializeLinkedData,
23{
24	from_rdf_quads_interpretation(
25		quads,
26		resources,
27		GenInterpretation::new(BlankIdGenerator::new()),
28	)
29}
30
31/// Deserializes an instance of `T` from the given quads and state.
32pub fn from_rdf_quads_with<Q, T>(
33	quads: impl IntoIterator<Item = Quad<Term>>,
34	resources: impl IntoIterator<Item = Term>,
35	state: Q,
36) -> Result<T, QuadsDeserializationFailed>
37where
38	T: DeserializeLinkedDataWith<Q>,
39{
40	from_rdf_quads_interpretation_with(
41		quads,
42		resources,
43		GenInterpretation::new(BlankIdGenerator::new()),
44		state,
45	)
46}
47
48/// Deserializes an instance of `T` from the given quads, using a custom RDF
49/// [interpretation](rdf_syntax::TryInterpretationMut).
50pub fn from_rdf_quads_interpretation<I, T>(
51	quads: impl IntoIterator<Item = Quad<I::Resource>>,
52	resources: impl IntoIterator<Item = I::Resource>,
53	interpretation: I,
54) -> Result<T, QuadsDeserializationFailed>
55where
56	I: TryInterpretationMut + TryReverseInterpretation,
57	I::Resource: Clone + Ord,
58	T: DeserializeLinkedData<I::Resource>,
59{
60	let dataset: IndexedBTreeDataset<I::Resource> = quads.into_iter().collect();
61	T::deserialize_rdf(
62		ResourcesDeserializer::new(DatasetDeserializer::new(dataset, interpretation), resources),
63		None,
64	)
65}
66
67/// Deserializes an instance of `T` from the given quads, state, and using a
68/// custom RDF [interpretation](rdf_syntax::TryInterpretationMut).
69pub fn from_rdf_quads_interpretation_with<Q, I, T>(
70	quads: impl IntoIterator<Item = Quad<I::Resource>>,
71	resources: impl IntoIterator<Item = I::Resource>,
72	interpretation: I,
73	state: Q,
74) -> Result<T, QuadsDeserializationFailed>
75where
76	I: TryInterpretationMut + TryReverseInterpretation,
77	I::Resource: Clone + Ord,
78	T: DeserializeLinkedDataWith<Q, I::Resource>,
79{
80	let dataset: IndexedBTreeDataset<I::Resource> = quads.into_iter().collect();
81	T::deserialize_rdf_with(
82		state,
83		ResourcesDeserializer::new(DatasetDeserializer::new(dataset, interpretation), resources),
84		None,
85	)
86}