Skip to main content

musq/types/
float.rs

1use std::result::Result as StdResult;
2
3use crate::{
4    decode::Decode,
5    encode::Encode,
6    error::{DecodeError, EncodeError},
7    sqlite::{SqliteDataType, Value},
8};
9
10impl Encode for f32 {
11    fn encode(&self) -> Result<Value, EncodeError> {
12        Ok(Value::Double {
13            value: (*self).into(),
14            type_info: None,
15        })
16    }
17}
18
19impl<'r> Decode<'r> for f32 {
20    fn decode(value: &'r Value) -> StdResult<Self, DecodeError> {
21        compatible!(value, SqliteDataType::Float | SqliteDataType::Numeric);
22        Ok(value.double()? as Self)
23    }
24}
25
26impl Encode for f64 {
27    fn encode(&self) -> Result<Value, EncodeError> {
28        Ok(Value::Double {
29            value: *self,
30            type_info: None,
31        })
32    }
33}
34
35impl<'r> Decode<'r> for f64 {
36    fn decode(value: &'r Value) -> StdResult<Self, DecodeError> {
37        compatible!(value, SqliteDataType::Float | SqliteDataType::Numeric);
38        value.double()
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use std::{f32::consts::PI, f64::consts::E};
45
46    use super::*;
47
48    #[test]
49    fn test_reference_encode() {
50        let value = PI;
51        let result = value.encode().unwrap();
52        if let Value::Double { value: encoded, .. } = result {
53            assert!((encoded - value as f64).abs() < 1e-6);
54        } else {
55            panic!("Expected Double value");
56        }
57
58        let value_f64 = E;
59        let result = value_f64.encode().unwrap();
60        if let Value::Double { value: encoded, .. } = result {
61            assert!((encoded - E).abs() < f64::EPSILON);
62        } else {
63            panic!("Expected Double value");
64        }
65    }
66}