rdf_fusion_functions/scalar/terms/
is_iri.rs

1use crate::scalar::dispatch::dispatch_unary_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::{ThinError, TypedValueRef};
10
11/// Checks whether a given RDF term is an IRI.
12///
13/// # Relevant Resources
14/// - [SPARQL 1.1 - isIRI](https://www.w3.org/TR/sparql11-query/#func-isIRI)
15#[derive(Debug, Hash, PartialEq, Eq)]
16pub struct IsIriSparqlOp;
17
18impl Default for IsIriSparqlOp {
19    fn default() -> Self {
20        Self::new()
21    }
22}
23
24impl IsIriSparqlOp {
25    const NAME: FunctionName = FunctionName::Builtin(BuiltinName::IsIri);
26
27    /// Creates a new [IsIriSparqlOp].
28    pub fn new() -> Self {
29        Self {}
30    }
31}
32
33impl ScalarSparqlOp for IsIriSparqlOp {
34    fn name(&self) -> &FunctionName {
35        &Self::NAME
36    }
37
38    fn signature(&self) -> ScalarSparqlOpSignature {
39        ScalarSparqlOpSignature::default_with_arity(SparqlOpArity::Fixed(1))
40    }
41
42    fn typed_value_encoding_op(
43        &self,
44    ) -> Option<Box<dyn ScalarSparqlOpImpl<TypedValueEncoding>>> {
45        Some(create_typed_value_sparql_op_impl(|args| {
46            dispatch_unary_typed_value(
47                &args.args[0],
48                |value| {
49                    Ok(TypedValueRef::BooleanLiteral(
50                        matches!(value, TypedValueRef::NamedNode(_)).into(),
51                    ))
52                },
53                ThinError::expected,
54            )
55        }))
56    }
57}