graphrecords_query/capabilities/numeric/
square_root.rs1use crate::{
2 Failure, IndexValue, QueryResult, Scalar, ValueDomain,
3 error::numeric::{NegativeSquareRoot, NonNumericValue},
4};
5use graphrecords_core::graphrecord::{GraphRecordValue, datatypes::Sqrt};
6
7pub trait ValueSquareRoot: ValueDomain {
8 fn square_root<'a>(label: &'static str, value: Self::Value<'a>)
9 -> QueryResult<Self::Value<'a>>;
10}
11
12impl ValueSquareRoot for Scalar {
13 fn square_root<'a>(
14 label: &'static str,
15 value: Self::Value<'a>,
16 ) -> QueryResult<Self::Value<'a>> {
17 match value {
18 GraphRecordValue::Int(integer) if integer < 0 => {
19 Err(Failure::new(label, NegativeSquareRoot::new(value)))
20 }
21 GraphRecordValue::Float(float) if float < 0.0 => {
22 Err(Failure::new(label, NegativeSquareRoot::new(value)))
23 }
24 GraphRecordValue::Int(_) | GraphRecordValue::Float(_) => Ok(value.sqrt()),
25 value => Err(Failure::new(label, NonNumericValue::new(value))),
26 }
27 }
28}
29
30impl ValueSquareRoot for IndexValue<GraphRecordValue> {
31 fn square_root<'a>(
32 label: &'static str,
33 value: Self::Value<'a>,
34 ) -> QueryResult<Self::Value<'a>> {
35 match value {
36 GraphRecordValue::Int(integer) if integer < 0 => {
37 Err(Failure::new(label, NegativeSquareRoot::new(value)))
38 }
39 GraphRecordValue::Float(float) if float < 0.0 => {
40 Err(Failure::new(label, NegativeSquareRoot::new(value)))
41 }
42 GraphRecordValue::Int(_) | GraphRecordValue::Float(_) => Ok(value.sqrt()),
43 value => Err(Failure::new(label, NonNumericValue::new(value))),
44 }
45 }
46}