chore: try from value (#2236)

* chore: try from value

* chore: add TryFromValueError variant
This commit is contained in:
discord9
2023-08-24 10:44:13 +08:00
committed by GitHub
parent beb92ba1d2
commit eca7e87129
2 changed files with 62 additions and 1 deletions

View File

@@ -115,6 +115,9 @@ pub enum Error {
#[snafu(display("Column {} already exists", column))]
DuplicateColumn { column: String, location: Location },
#[snafu(display("Failed to unpack value to given type: {}", reason))]
TryFromValue { reason: String, location: Location },
}
impl ErrorExt for Error {

View File

@@ -32,7 +32,7 @@ use serde::{Deserialize, Serialize};
use snafu::{ensure, ResultExt};
use crate::error;
use crate::error::Result;
use crate::error::{Error, Result, TryFromValueSnafu};
use crate::prelude::*;
use crate::type_id::LogicalTypeId;
use crate::types::{IntervalType, ListType};
@@ -441,6 +441,62 @@ impl Ord for Value {
}
}
macro_rules! impl_try_from_value {
($Variant: ident, $Type: ident) => {
impl TryFrom<Value> for $Type {
type Error = Error;
#[inline]
fn try_from(from: Value) -> std::result::Result<Self, Self::Error> {
match from {
Value::$Variant(v) => Ok(v.into()),
_ => TryFromValueSnafu {
reason: format!("{:?} is not a {}", from, stringify!($Type)),
}
.fail(),
}
}
}
impl TryFrom<Value> for Option<$Type> {
type Error = Error;
#[inline]
fn try_from(from: Value) -> std::result::Result<Self, Self::Error> {
match from {
Value::$Variant(v) => Ok(Some(v.into())),
Value::Null => Ok(None),
_ => TryFromValueSnafu {
reason: format!("{:?} is not a {}", from, stringify!($Type)),
}
.fail(),
}
}
}
};
}
impl_try_from_value!(Boolean, bool);
impl_try_from_value!(UInt8, u8);
impl_try_from_value!(UInt16, u16);
impl_try_from_value!(UInt32, u32);
impl_try_from_value!(UInt64, u64);
impl_try_from_value!(Int8, i8);
impl_try_from_value!(Int16, i16);
impl_try_from_value!(Int32, i32);
impl_try_from_value!(Int64, i64);
impl_try_from_value!(Float32, f32);
impl_try_from_value!(Float64, f64);
impl_try_from_value!(Float32, OrderedF32);
impl_try_from_value!(Float64, OrderedF64);
impl_try_from_value!(String, StringBytes);
impl_try_from_value!(Binary, Bytes);
impl_try_from_value!(Date, Date);
impl_try_from_value!(Time, Time);
impl_try_from_value!(DateTime, DateTime);
impl_try_from_value!(Timestamp, Timestamp);
impl_try_from_value!(Interval, Interval);
macro_rules! impl_value_from {
($Variant: ident, $Type: ident) => {
impl From<$Type> for Value {
@@ -471,6 +527,8 @@ impl_value_from!(Int32, i32);
impl_value_from!(Int64, i64);
impl_value_from!(Float32, f32);
impl_value_from!(Float64, f64);
impl_value_from!(Float32, OrderedF32);
impl_value_from!(Float64, OrderedF64);
impl_value_from!(String, StringBytes);
impl_value_from!(Binary, Bytes);
impl_value_from!(Date, Date);