rdf_fusion_encoding/plain_term/encoders/
default.rs

1use crate::encoding::TermEncoder;
2use crate::plain_term::{PlainTermArrayElementBuilder, PlainTermEncoding};
3use crate::{EncodingArray, TermEncoding};
4use rdf_fusion_model::DFResult;
5use rdf_fusion_model::{TermRef, ThinResult};
6
7#[derive(Debug)]
8pub struct DefaultPlainTermEncoder;
9
10impl TermEncoder<PlainTermEncoding> for DefaultPlainTermEncoder {
11    type Term<'data> = TermRef<'data>;
12
13    fn encode_terms<'data>(
14        terms: impl IntoIterator<Item = ThinResult<Self::Term<'data>>>,
15    ) -> DFResult<<PlainTermEncoding as TermEncoding>::Array> {
16        let mut value_builder = PlainTermArrayElementBuilder::default();
17        for value in terms {
18            match value {
19                Ok(TermRef::NamedNode(value)) => value_builder.append_named_node(value),
20                Ok(TermRef::BlankNode(value)) => value_builder.append_blank_node(value),
21                Ok(TermRef::Literal(value)) => value_builder.append_literal(value),
22                Err(_) => value_builder.append_null(),
23            }
24        }
25        Ok(value_builder.finish())
26    }
27
28    fn encode_term(
29        term: ThinResult<Self::Term<'_>>,
30    ) -> DFResult<<PlainTermEncoding as TermEncoding>::Scalar> {
31        Self::encode_terms([term])?.try_as_scalar(0)
32    }
33}