From c300d18a757a761fbc77fe42593b586b900bbc9a Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 14 Jun 2020 17:59:57 -0400 Subject: [PATCH] Implement the outstanding type casts for serde_json. --- src/bin.rs | 69 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 15 deletions(-) diff --git a/src/bin.rs b/src/bin.rs index 1a031fd..3a7eade 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -355,24 +355,63 @@ impl Castable for serde_json::Value { }) .ok(), (serde_json::Value::Number(_), "number") => Some(IceResult::from_borrowed(self)), - (serde_json::Value::Null, "number") => None, - (serde_json::Value::Bool(_), "number") => None, + (serde_json::Value::Null, "number") => { + Some(IceResult::from_owned(serde_json::Value::Number(0.into()))) + } + (serde_json::Value::Bool(boolean), "number") => { + if *boolean { + Some(IceResult::from_owned(serde_json::Value::Number(1.into()))) + } else { + Some(IceResult::from_owned(serde_json::Value::Number(0.into()))) + } + } (serde_json::Value::Array(_), "number") => None, (serde_json::Value::Object(_), "number") => None, - (serde_json::Value::String(text), "string") => todo!(), - (serde_json::Value::Number(_), "string") => todo!(), - (serde_json::Value::Null, "string") => todo!(), - (serde_json::Value::Bool(_), "string") => todo!(), - (serde_json::Value::Array(_), "string") => todo!(), - (serde_json::Value::Object(_), "string") => todo!(), - - (serde_json::Value::String(text), "boolean") => todo!(), - (serde_json::Value::Number(_), "boolean") => todo!(), - (serde_json::Value::Null, "boolean") => todo!(), - (serde_json::Value::Bool(_), "boolean") => todo!(), - (serde_json::Value::Array(_), "boolean") => todo!(), - (serde_json::Value::Object(_), "boolean") => todo!(), + (serde_json::Value::String(text), "string") => Some(IceResult::from_borrowed(self)), + (serde_json::Value::Number(num), "string") => Some(IceResult::from_owned( + serde_json::Value::String(num.to_string()), + )), + (serde_json::Value::Null, "string") => Some(IceResult::from_owned( + serde_json::Value::String("null".to_owned()), + )), + (serde_json::Value::Bool(boolean), "string") => Some(IceResult::from_owned( + serde_json::Value::String(boolean.to_string()), + )), + (serde_json::Value::Array(_), "string") => Some(IceResult::from_owned( + serde_json::Value::String(self.render(&Vec::new()).unwrap_or("".to_owned())), + )), + (serde_json::Value::Object(_), "string") => Some(IceResult::from_owned( + serde_json::Value::String(self.render(&Vec::new()).unwrap_or("".to_owned())), + )), + + (serde_json::Value::String(text), "boolean") => { + if text.is_empty() { + Some(IceResult::from_owned(serde_json::Value::Bool(false))) + } else { + Some(IceResult::from_owned(serde_json::Value::Bool(true))) + } + } + (serde_json::Value::Number(json_num), "boolean") => { + Some(IceResult::from_owned(serde_json::Value::Bool( + match (json_num.as_u64(), json_num.as_i64(), json_num.as_f64()) { + (Some(num), _, _) => num != 0, + (_, Some(num), _) => num != 0, + (_, _, Some(num)) => num != 0.0 && !num.is_nan(), + _ => false, + }, + ))) + } + (serde_json::Value::Null, "boolean") => { + Some(IceResult::from_owned(serde_json::Value::Bool(false))) + } + (serde_json::Value::Bool(_), "boolean") => Some(IceResult::from_borrowed(self)), + (serde_json::Value::Array(_), "boolean") => { + Some(IceResult::from_owned(serde_json::Value::Bool(true))) + } + (serde_json::Value::Object(_), "boolean") => { + Some(IceResult::from_owned(serde_json::Value::Bool(true))) + } (_, _) => panic!("Unimplemented cast"), }