use qubit_datatype::{
DataConversionOptions,
DataConversionTarget,
DataConverter,
};
use super::value::{
Value,
ValueRepr,
};
use crate::value_error::{
ValueError,
ValueResult,
};
macro_rules! value_data_converter_match {
($value:expr; $(([$($cfg:meta),*], $variant:ident, $type:ty, $data_type:expr, $materialization:ident, $json_class:ident, $number_projection:ident, $value_doc:literal, $multi_doc:literal)),+ $(,)?) => {
match &$value.repr {
ValueRepr::Unset(data_type) => DataConverter::Unset(*data_type),
$($(#[$cfg])* ValueRepr::$variant(value) => DataConverter::from(value_storage_ref!($variant, value)),)+
}
};
}
fn data_converter_from_value(value: &Value) -> DataConverter<'_> {
for_each_value_type!(value_data_converter_match, value)
}
pub(super) fn convert_with_data_converter_with<T>(
value: &Value,
options: &DataConversionOptions,
) -> ValueResult<T>
where
T: DataConversionTarget,
{
data_converter_from_value(value)
.to_with::<T>(options)
.map_err(ValueError::from)
}