use qubit_datatype::{
DataConversionOptions,
DataConvertTo,
DataConverter,
};
use super::value::Value;
use crate::value_error::{
ValueResult,
map_data_conversion_error,
};
fn data_converter_from_value(value: &Value) -> DataConverter<'_> {
match value {
Value::Empty(data_type) => DataConverter::Empty(*data_type),
Value::Bool(value) => DataConverter::from(value),
Value::Char(value) => DataConverter::from(value),
Value::Int8(value) => DataConverter::from(value),
Value::Int16(value) => DataConverter::from(value),
Value::Int32(value) => DataConverter::from(value),
Value::Int64(value) => DataConverter::from(value),
Value::Int128(value) => DataConverter::from(value),
Value::UInt8(value) => DataConverter::from(value),
Value::UInt16(value) => DataConverter::from(value),
Value::UInt32(value) => DataConverter::from(value),
Value::UInt64(value) => DataConverter::from(value),
Value::UInt128(value) => DataConverter::from(value),
Value::IntSize(value) => DataConverter::from(value),
Value::UIntSize(value) => DataConverter::from(value),
Value::Float32(value) => DataConverter::from(value),
Value::Float64(value) => DataConverter::from(value),
Value::BigInteger(value) => DataConverter::from(value),
Value::BigDecimal(value) => DataConverter::from(value),
Value::String(value) => DataConverter::from(value),
Value::Date(value) => DataConverter::from(value),
Value::Time(value) => DataConverter::from(value),
Value::DateTime(value) => DataConverter::from(value),
Value::Instant(value) => DataConverter::from(value),
Value::Duration(value) => DataConverter::from(value),
Value::Url(value) => DataConverter::from(value),
Value::StringMap(value) => DataConverter::from(value),
Value::Json(value) => DataConverter::from(value),
}
}
pub(super) fn convert_with_data_converter_with<T>(
value: &Value,
options: &DataConversionOptions,
) -> ValueResult<T>
where
for<'a> DataConverter<'a>: DataConvertTo<T>,
{
data_converter_from_value(value)
.to_with::<T>(options)
.map_err(map_data_conversion_error)
}