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}