use serde_json::Value;
use crate::error::TigerError;
pub fn decode_value<T>(v: Value) -> Result<T, TigerError>
where
T: serde::de::DeserializeOwned,
{
match serde_json::from_value::<T>(v.clone()) {
Ok(out) => Ok(out),
Err(original_err) => {
if let Value::String(s) = &v {
return serde_json::from_str::<T>(s).map_err(|e| {
TigerError::Parse(format!("decode data (double-encoded) failed: {}", e))
});
}
Err(TigerError::Parse(format!(
"decode data failed: {}",
original_err
)))
}
}
}