rdf_fusion_functions/scalar/strings/
ucase.rs1use 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}