rdf_fusion_functions/scalar/strings/
str_ends.rs1use crate::scalar::dispatch::dispatch_binary_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 CompatibleStringArgs, StringLiteralRef, ThinError, TypedValueRef,
11};
12
13#[derive(Debug, Hash, PartialEq, Eq)]
15pub struct StrEndsSparqlOp;
16
17impl Default for StrEndsSparqlOp {
18 fn default() -> Self {
19 Self::new()
20 }
21}
22
23impl StrEndsSparqlOp {
24 const NAME: FunctionName = FunctionName::Builtin(BuiltinName::StrEnds);
25
26 pub fn new() -> Self {
28 Self {}
29 }
30}
31
32impl ScalarSparqlOp for StrEndsSparqlOp {
33 fn name(&self) -> &FunctionName {
34 &Self::NAME
35 }
36
37 fn signature(&self) -> ScalarSparqlOpSignature {
38 ScalarSparqlOpSignature::default_with_arity(SparqlOpArity::Fixed(2))
39 }
40 fn typed_value_encoding_op(
41 &self,
42 ) -> Option<Box<dyn ScalarSparqlOpImpl<TypedValueEncoding>>> {
43 Some(create_typed_value_sparql_op_impl(|args| {
44 dispatch_binary_typed_value(
45 &args.args[0],
46 &args.args[1],
47 |lhs_value, rhs_value| {
48 let lhs_value = StringLiteralRef::try_from(lhs_value)?;
49 let rhs_value = StringLiteralRef::try_from(rhs_value)?;
50 let args = CompatibleStringArgs::try_from(lhs_value, rhs_value)?;
51 Ok(TypedValueRef::BooleanLiteral(
52 args.lhs.ends_with(args.rhs).into(),
53 ))
54 },
55 |_, _| ThinError::expected(),
56 )
57 }))
58 }
59}