rdf_fusion_functions/scalar/strings/
sha384.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::{SimpleLiteral, ThinError, TypedValue, TypedValueRef};
10use sha2::{Digest, Sha384};
11
12#[derive(Debug, Hash, PartialEq, Eq)]
13pub struct Sha384SparqlOp;
14
15impl Default for Sha384SparqlOp {
16 fn default() -> Self {
17 Self::new()
18 }
19}
20
21impl Sha384SparqlOp {
22 const NAME: FunctionName = FunctionName::Builtin(BuiltinName::Sha384);
23
24 pub fn new() -> Self {
25 Self {}
26 }
27}
28
29impl ScalarSparqlOp for Sha384SparqlOp {
30 fn name(&self) -> &FunctionName {
31 &Self::NAME
32 }
33
34 fn signature(&self) -> ScalarSparqlOpSignature {
35 ScalarSparqlOpSignature::default_with_arity(SparqlOpArity::Fixed(1))
36 }
37 fn typed_value_encoding_op(
38 &self,
39 ) -> Option<Box<dyn ScalarSparqlOpImpl<TypedValueEncoding>>> {
40 Some(create_typed_value_sparql_op_impl(|args| {
41 dispatch_unary_owned_typed_value(
42 &args.args[0],
43 |value| {
44 let string = match value {
45 TypedValueRef::SimpleLiteral(value) => value.value,
46 TypedValueRef::LanguageStringLiteral(value) => value.value,
47 _ => return ThinError::expected(),
48 };
49
50 let mut hasher = Sha384::new();
51 hasher.update(string);
52 let result = hasher.finalize();
53 let value = format!("{result:x}");
54
55 Ok(TypedValue::SimpleLiteral(SimpleLiteral { value }))
56 },
57 ThinError::expected,
58 )
59 }))
60 }
61}