rdf_fusion_functions/scalar/strings/
ucase.rs

1use crate::scalar::dispatch::dispatch_unary_owned_typed_value;
2use crate::scalar::sparql_op_impl::{
3    ScalarSparqlOpImpl, create_typed_value_sparql_op_impl,
4};
5use crate::scalar::{ScalarSparqlOp, ScalarSparqlOpSignature, SparqlOpArity};
6use rdf_fusion_encoding::typed_value::TypedValueEncoding;
7use rdf_fusion_extensions::functions::BuiltinName;
8use rdf_fusion_extensions::functions::FunctionName;
9use rdf_fusion_model::{
10    LanguageString, SimpleLiteral, ThinError, TypedValue, TypedValueRef,
11};
12
13#[derive(Debug, Hash, PartialEq, Eq)]
14pub struct UCaseSparqlOp;
15
16impl Default for UCaseSparqlOp {
17    fn default() -> Self {
18        Self::new()
19    }
20}
21
22impl UCaseSparqlOp {
23    const NAME: FunctionName = FunctionName::Builtin(BuiltinName::UCase);
24
25    pub fn new() -> Self {
26        Self {}
27    }
28}
29
30impl ScalarSparqlOp for UCaseSparqlOp {
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| match value {
46                    TypedValueRef::SimpleLiteral(value) => {
47                        Ok(TypedValue::SimpleLiteral(SimpleLiteral {
48                            value: value.value.to_uppercase(),
49                        }))
50                    }
51                    TypedValueRef::LanguageStringLiteral(value) => {
52                        Ok(TypedValue::LanguageStringLiteral(LanguageString {
53                            value: value.value.to_uppercase(),
54                            language: value.language.to_owned(),
55                        }))
56                    }
57                    _ => ThinError::expected(),
58                },
59                ThinError::expected,
60            )
61        }))
62    }
63}