rdf_fusion_functions/scalar/conversion/
cast_string.rs1use 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}