rdf_fusion_encoding/plain_term/encoders/
simple.rs

1use crate::encoding::TermEncoder;
2use crate::plain_term::{PlainTermArrayElementBuilder, PlainTermEncoding};
3use crate::{EncodingArray, TermEncoding};
4use rdf_fusion_model::DFResult;
5use rdf_fusion_model::vocab::xsd;
6use rdf_fusion_model::{Boolean, LiteralRef, SimpleLiteralRef, ThinResult};
7
8#[derive(Debug)]
9pub struct BooleanPlainTermEncoder;
10
11impl TermEncoder<PlainTermEncoding> for BooleanPlainTermEncoder {
12    type Term<'data> = Boolean;
13
14    fn encode_terms<'data>(
15        terms: impl IntoIterator<Item = ThinResult<Self::Term<'data>>>,
16    ) -> DFResult<<PlainTermEncoding as TermEncoding>::Array> {
17        let iter = terms.into_iter();
18        let (min, _) = iter.size_hint();
19        let mut builder = PlainTermArrayElementBuilder::new(min);
20
21        for value in iter {
22            if let Ok(value) = value {
23                builder.append_literal(LiteralRef::new_typed_literal(
24                    &value.to_string(),
25                    xsd::BOOLEAN,
26                ));
27            } else {
28                builder.append_null();
29            }
30        }
31
32        Ok(builder.finish())
33    }
34
35    fn encode_term(
36        term: ThinResult<Self::Term<'_>>,
37    ) -> DFResult<<PlainTermEncoding as TermEncoding>::Scalar> {
38        Self::encode_terms([term])?.try_as_scalar(0)
39    }
40}
41
42#[derive(Debug)]
43pub struct SimpleLiteralRefPlainTermEncoder;
44
45impl TermEncoder<PlainTermEncoding> for SimpleLiteralRefPlainTermEncoder {
46    type Term<'data> = SimpleLiteralRef<'data>;
47
48    fn encode_terms<'data>(
49        terms: impl IntoIterator<Item = ThinResult<Self::Term<'data>>>,
50    ) -> DFResult<<PlainTermEncoding as TermEncoding>::Array> {
51        let iter = terms.into_iter();
52        let (min, _) = iter.size_hint();
53        let mut builder = PlainTermArrayElementBuilder::new(min);
54
55        for value in iter {
56            if let Ok(value) = value {
57                builder.append_literal(LiteralRef::new_simple_literal(value.value));
58            } else {
59                builder.append_null();
60            }
61        }
62
63        Ok(builder.finish())
64    }
65
66    fn encode_term(
67        term: ThinResult<Self::Term<'_>>,
68    ) -> DFResult<<PlainTermEncoding as TermEncoding>::Scalar> {
69        Self::encode_terms([term])?.try_as_scalar(0)
70    }
71}