Skip to main content

graphrecords_query/capabilities/numeric/
square_root.rs

1use 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}