musq 0.0.3

musq is a SQLite3 driver for Rust focusing on performance, correctness, and flexibility.
Documentation
use std::result::Result as StdResult;

use crate::{
    decode::Decode,
    encode::Encode,
    error::{DecodeError, EncodeError},
    sqlite::{SqliteDataType, Value},
};

impl Encode for f32 {
    fn encode(&self) -> Result<Value, EncodeError> {
        Ok(Value::Double {
            value: (*self).into(),
            type_info: None,
        })
    }
}

impl<'r> Decode<'r> for f32 {
    fn decode(value: &'r Value) -> StdResult<Self, DecodeError> {
        compatible!(value, SqliteDataType::Float | SqliteDataType::Numeric);
        Ok(value.double()? as Self)
    }
}

impl Encode for f64 {
    fn encode(&self) -> Result<Value, EncodeError> {
        Ok(Value::Double {
            value: *self,
            type_info: None,
        })
    }
}

impl<'r> Decode<'r> for f64 {
    fn decode(value: &'r Value) -> StdResult<Self, DecodeError> {
        compatible!(value, SqliteDataType::Float | SqliteDataType::Numeric);
        value.double()
    }
}

#[cfg(test)]
mod tests {
    use std::{f32::consts::PI, f64::consts::E};

    use super::*;

    #[test]
    fn test_reference_encode() {
        let value = PI;
        let result = value.encode().unwrap();
        if let Value::Double { value: encoded, .. } = result {
            assert!((encoded - value as f64).abs() < 1e-6);
        } else {
            panic!("Expected Double value");
        }

        let value_f64 = E;
        let result = value_f64.encode().unwrap();
        if let Value::Double { value: encoded, .. } = result {
            assert!((encoded - E).abs() < f64::EPSILON);
        } else {
            panic!("Expected Double value");
        }
    }
}