queryscript 0.1.4

Queryscript is a SQL-based language that allows you to use higher order abstractions like variables, functions, and modules alongside SQL queries.
pub use super::types::*;
pub use super::value::*;

macro_rules! primitive_conversion {
    ($native_ty:ty, $arm:tt, $return_ty:ty) => {
        impl From<$native_ty> for Value {
            fn from(val: $native_ty) -> Self {
                Value::$arm(val.into())
            }
        }

        impl TryInto<$return_ty> for Value {
            type Error = super::error::TypesystemError;

            fn try_into(self) -> super::error::Result<$return_ty> {
                match self {
                    Value::$arm(v) => Ok(v.into()),
                    _ => super::error::ts_fail!(
                        "Expected {} but got {:?}",
                        stringify!($return_ty),
                        self
                    ),
                }
            }
        }
    };
    ($native_ty:ty, $arm:tt) => {
        primitive_conversion!($native_ty, $arm, $native_ty);
    };
}

primitive_conversion!(bool, Boolean);
primitive_conversion!(i8, Int8);
primitive_conversion!(i16, Int16);
primitive_conversion!(i32, Int32);
primitive_conversion!(i64, Int64);
primitive_conversion!(u8, UInt8);
primitive_conversion!(u16, UInt16);
primitive_conversion!(u32, UInt32);
primitive_conversion!(u64, UInt64);
primitive_conversion!(half::f16, Float16);
primitive_conversion!(f32, Float32);
primitive_conversion!(f64, Float64);
primitive_conversion!(String, Utf8);
primitive_conversion!(&[u8], Binary, Vec<u8>);
primitive_conversion!(i128, Decimal128);
primitive_conversion!(i256, Decimal256);

impl<T> From<Option<T>> for Value
where
    T: Into<Value>,
{
    fn from(val: Option<T>) -> Self {
        match val {
            Some(v) => v.into(),
            None => Value::Null,
        }
    }
}