rdf_fusion_encoding/plain_term/decoders/
graph_name.rs

1use crate::TermEncoding;
2use crate::encoding::TermDecoder;
3use crate::plain_term::PlainTermEncoding;
4use crate::plain_term::decoders::DefaultPlainTermDecoder;
5use rdf_fusion_model::{GraphNameRef, TermRef, ThinResult};
6
7#[derive(Debug)]
8pub struct GraphNameRefPlainTermDecoder;
9
10/// Extracts a sequence of term references from the given array.
11impl TermDecoder<PlainTermEncoding> for GraphNameRefPlainTermDecoder {
12    type Term<'data> = GraphNameRef<'data>;
13
14    fn decode_terms(
15        array: &<PlainTermEncoding as TermEncoding>::Array,
16    ) -> impl Iterator<Item = ThinResult<Self::Term<'_>>> {
17        DefaultPlainTermDecoder::decode_terms(array).map(map_term_ref_to_graph_name_ref)
18    }
19
20    fn decode_term(
21        scalar: &<PlainTermEncoding as TermEncoding>::Scalar,
22    ) -> ThinResult<Self::Term<'_>> {
23        let term = DefaultPlainTermDecoder::decode_term(scalar);
24        map_term_ref_to_graph_name_ref(term)
25    }
26}
27
28fn map_term_ref_to_graph_name_ref(
29    term: ThinResult<TermRef<'_>>,
30) -> ThinResult<GraphNameRef<'_>> {
31    match term {
32        Ok(TermRef::NamedNode(nn)) => Ok(GraphNameRef::NamedNode(nn)),
33        Ok(TermRef::BlankNode(bnode)) => Ok(GraphNameRef::BlankNode(bnode)),
34        Ok(TermRef::Literal(_)) => panic!("Literal when extracting graph name"),
35        Err(_) => Ok(GraphNameRef::DefaultGraph),
36    }
37}