use crate::scalar::Real;
use crate::{Quantity, Unit};
use diesel::{
backend::Backend,
deserialize::{self, FromSql as DieselFromSql},
expression::AsExpression,
query_builder::QueryId,
serialize::{self, Output, ToSql as DieselToSql},
sql_types::{Double, Float, Nullable},
Queryable,
};
impl<U, DB> DieselFromSql<Double, DB> for Quantity<U, f64>
where
U: Unit,
DB: Backend,
f64: DieselFromSql<Double, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> deserialize::Result<Self> {
let value = f64::from_sql(bytes)?;
Ok(Quantity::new(value))
}
}
impl<U, DB> DieselToSql<Double, DB> for Quantity<U, f64>
where
U: Unit,
DB: Backend,
f64: DieselToSql<Double, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> serialize::Result {
<f64 as DieselToSql<Double, DB>>::to_sql(self.value_ref(), out)
}
}
impl<U, DB> DieselFromSql<Float, DB> for Quantity<U, f32>
where
U: Unit,
DB: Backend,
f32: DieselFromSql<Float, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> deserialize::Result<Self> {
let value = f32::from_sql(bytes)?;
Ok(Quantity::new(value))
}
}
impl<U, DB> DieselToSql<Float, DB> for Quantity<U, f32>
where
U: Unit,
DB: Backend,
f32: DieselToSql<Float, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> serialize::Result {
<f32 as DieselToSql<Float, DB>>::to_sql(self.value_ref(), out)
}
}
impl<U, DB> DieselFromSql<Nullable<Double>, DB> for Quantity<U, f64>
where
U: Unit,
DB: Backend,
f64: DieselFromSql<Double, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> deserialize::Result<Self> {
let value = f64::from_sql(bytes)?;
Ok(Quantity::new(value))
}
}
impl<U, DB> DieselToSql<Nullable<Double>, DB> for Quantity<U, f64>
where
U: Unit,
DB: Backend,
f64: DieselToSql<Double, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> serialize::Result {
<f64 as DieselToSql<Double, DB>>::to_sql(self.value_ref(), out)
}
}
impl<U, DB> DieselFromSql<Nullable<Float>, DB> for Quantity<U, f32>
where
U: Unit,
DB: Backend,
f32: DieselFromSql<Float, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> deserialize::Result<Self> {
let value = f32::from_sql(bytes)?;
Ok(Quantity::new(value))
}
}
impl<U, DB> DieselToSql<Nullable<Float>, DB> for Quantity<U, f32>
where
U: Unit,
DB: Backend,
f32: DieselToSql<Float, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> serialize::Result {
<f32 as DieselToSql<Float, DB>>::to_sql(self.value_ref(), out)
}
}
impl<U: Unit> AsExpression<Double> for Quantity<U, f64> {
type Expression = <f64 as AsExpression<Double>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Double>::as_expression(self.value())
}
}
impl<U: Unit> AsExpression<Double> for &Quantity<U, f64> {
type Expression = <f64 as AsExpression<Double>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Double>::as_expression(self.value())
}
}
impl<U: Unit> AsExpression<Nullable<Double>> for Quantity<U, f64> {
type Expression = <f64 as AsExpression<Nullable<Double>>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Nullable<Double>>::as_expression(self.value())
}
}
impl<U: Unit> AsExpression<Nullable<Double>> for &Quantity<U, f64> {
type Expression = <f64 as AsExpression<Nullable<Double>>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Nullable<Double>>::as_expression(self.value())
}
}
impl<U: Unit> AsExpression<Float> for Quantity<U, f32> {
type Expression = <f32 as AsExpression<Float>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Float>::as_expression(self.value())
}
}
impl<U: Unit> AsExpression<Float> for &Quantity<U, f32> {
type Expression = <f32 as AsExpression<Float>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Float>::as_expression(self.value())
}
}
impl<U: Unit> AsExpression<Nullable<Float>> for Quantity<U, f32> {
type Expression = <f32 as AsExpression<Nullable<Float>>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Nullable<Float>>::as_expression(self.value())
}
}
impl<U: Unit> AsExpression<Nullable<Float>> for &Quantity<U, f32> {
type Expression = <f32 as AsExpression<Nullable<Float>>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::<Nullable<Float>>::as_expression(self.value())
}
}
impl<U, DB> Queryable<Double, DB> for Quantity<U, f64>
where
U: Unit,
DB: Backend,
f64: Queryable<Double, DB>,
{
type Row = <f64 as Queryable<Double, DB>>::Row;
fn build(row: Self::Row) -> deserialize::Result<Self> {
let value = <f64 as Queryable<Double, DB>>::build(row)?;
Ok(Quantity::new(value))
}
}
impl<U, DB> Queryable<Nullable<Double>, DB> for Quantity<U, f64>
where
U: Unit,
DB: Backend,
f64: Queryable<Nullable<Double>, DB>,
{
type Row = <f64 as Queryable<Nullable<Double>, DB>>::Row;
fn build(row: Self::Row) -> deserialize::Result<Self> {
let value = <f64 as Queryable<Nullable<Double>, DB>>::build(row)?;
Ok(Quantity::new(value))
}
}
impl<U, DB> Queryable<Float, DB> for Quantity<U, f32>
where
U: Unit,
DB: Backend,
f32: Queryable<Float, DB>,
{
type Row = <f32 as Queryable<Float, DB>>::Row;
fn build(row: Self::Row) -> deserialize::Result<Self> {
let value = <f32 as Queryable<Float, DB>>::build(row)?;
Ok(Quantity::new(value))
}
}
impl<U, DB> Queryable<Nullable<Float>, DB> for Quantity<U, f32>
where
U: Unit,
DB: Backend,
f32: Queryable<Nullable<Float>, DB>,
{
type Row = <f32 as Queryable<Nullable<Float>, DB>>::Row;
fn build(row: Self::Row) -> deserialize::Result<Self> {
let value = <f32 as Queryable<Nullable<Float>, DB>>::build(row)?;
Ok(Quantity::new(value))
}
}
impl<U: Unit, S: Real> QueryId for Quantity<U, S> {
type QueryId = Self;
const HAS_STATIC_QUERY_ID: bool = false;
}