rdf_fusion_functions/scalar/conversion/
cast_string.rs

1use rdf_fusion_model::ThinError;
2use rdf_fusion_model::{SimpleLiteral, TypedValue, TypedValueRef};
3
4use crate::scalar::dispatch::dispatch_unary_owned_typed_value;
5use crate::scalar::sparql_op_impl::{
6    ScalarSparqlOpImpl, create_typed_value_sparql_op_impl,
7};
8use crate::scalar::{ScalarSparqlOp, ScalarSparqlOpSignature, SparqlOpArity};
9use rdf_fusion_encoding::typed_value::TypedValueEncoding;
10use rdf_fusion_extensions::functions::BuiltinName;
11use rdf_fusion_extensions::functions::FunctionName;
12
13#[derive(Debug, Hash, PartialEq, Eq)]
14pub struct CastStringSparqlOp;
15
16impl Default for CastStringSparqlOp {
17    fn default() -> Self {
18        Self::new()
19    }
20}
21
22impl CastStringSparqlOp {
23    const NAME: FunctionName = FunctionName::Builtin(BuiltinName::CastString);
24
25    pub fn new() -> Self {
26        Self {}
27    }
28}
29
30impl ScalarSparqlOp for CastStringSparqlOp {
31    fn name(&self) -> &FunctionName {
32        &Self::NAME
33    }
34
35    fn signature(&self) -> ScalarSparqlOpSignature {
36        ScalarSparqlOpSignature::default_with_arity(SparqlOpArity::Fixed(1))
37    }
38
39    fn typed_value_encoding_op(
40        &self,
41    ) -> Option<Box<dyn ScalarSparqlOpImpl<TypedValueEncoding>>> {
42        Some(create_typed_value_sparql_op_impl(|args| {
43            dispatch_unary_owned_typed_value(
44                &args.args[0],
45                |value| {
46                    let converted = match value {
47                        TypedValueRef::NamedNode(value) => value.as_str().to_owned(),
48                        TypedValueRef::BlankNode(_) => return ThinError::expected(),
49                        TypedValueRef::BooleanLiteral(value) => value.to_string(),
50                        TypedValueRef::NumericLiteral(value) => value.format_value(),
51                        TypedValueRef::SimpleLiteral(value) => value.value.to_owned(),
52                        TypedValueRef::LanguageStringLiteral(value) => {
53                            value.value.to_owned()
54                        }
55                        TypedValueRef::DateTimeLiteral(value) => value.to_string(),
56                        TypedValueRef::TimeLiteral(value) => value.to_string(),
57                        TypedValueRef::DateLiteral(value) => value.to_string(),
58                        TypedValueRef::DurationLiteral(value) => value.to_string(),
59                        TypedValueRef::YearMonthDurationLiteral(value) => {
60                            value.to_string()
61                        }
62                        TypedValueRef::DayTimeDurationLiteral(value) => value.to_string(),
63                        TypedValueRef::OtherLiteral(value) => value.value().to_owned(),
64                    };
65                    Ok(TypedValue::SimpleLiteral(SimpleLiteral {
66                        value: converted,
67                    }))
68                },
69                ThinError::expected,
70            )
71        }))
72    }
73}