rdf_fusion_encoding/plain_term/encoders/
simple.rs1use 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}