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::Config(format!("decode data (double-encoded) failed: {}", e))
});
}
Err(TigerError::Config(format!("decode data failed: {}", original_err)))
}
}
}