Skip to content

Commit

Permalink
fix: support any values for provider state parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
Ronald Holshausen committed Oct 28, 2020
1 parent 5077161 commit df4df0b
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 10 deletions.
11 changes: 1 addition & 10 deletions native/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,16 +273,7 @@ declare_types! {
let props = js_props.to_vec(&mut cx).unwrap().iter().map(|prop| {
let prop_name = prop.downcast::<JsString>().unwrap().value();
let prop_val = parameters.get(&mut cx, prop_name.as_str()).unwrap();
if let Ok(val) = prop_val.downcast::<JsString>() {
(prop_name, json!(val.value()))
} else if let Ok(val) = prop_val.downcast::<JsNumber>() {
(prop_name, json!(val.value()))
} else if let Ok(val) = prop_val.downcast::<JsBoolean>() {
(prop_name, json!(val.value()))
} else {
error!("Ignoring value for provider state parameter '{}'", prop_name);
(prop_name, Value::Null)
}
(prop_name, utils::js_value_to_serde_value(&prop_val, &mut cx))
}).collect();
ProviderState { name: description.clone(), params: props }
},
Expand Down
29 changes: 29 additions & 0 deletions native/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use serde_json::Value;
use serde_json::map::Map;
use neon::prelude::*;
use log::*;

pub fn serde_value_to_js_object_attr<'a>(cx: &mut TaskContext, obj: &Handle<'a, JsObject>, key: &String, value: &Value) -> Result<bool, neon::result::Throw> {
match value {
Expand Down Expand Up @@ -78,3 +80,30 @@ fn serde_value_to_js_array_value<'a>(cx: &mut TaskContext, array: &Handle<'a, Js
}
}
}

pub(crate) fn js_value_to_serde_value<'a, C: Context<'a>>(value: &Handle<'a, JsValue>, cx: &mut C) -> Value {
if let Ok(val) = value.downcast::<JsString>() {
Value::String(val.value())
} else if let Ok(val) = value.downcast::<JsNumber>() {
json!(val.value())
} else if let Ok(val) = value.downcast::<JsBoolean>() {
Value::Bool(val.value())
} else if let Ok(val) = value.downcast::<JsArray>() {
Value::Array(val.to_vec(cx).unwrap().iter().map(|v| js_value_to_serde_value(v, cx)).collect())
} else if let Ok(_) = value.downcast::<JsNull>() {
Value::Null
} else if let Ok(_) = value.downcast::<JsUndefined>() {
Value::Null
} else if let Ok(val) = value.downcast::<JsObject>() {
let js_props = val.get_own_property_names(cx).unwrap();
let props: Map<String, Value> = js_props.to_vec(cx).unwrap().iter().map(|prop| {
let prop_name = prop.downcast::<JsString>().unwrap().value();
let prop_val = val.get(cx, prop_name.as_str()).unwrap();
(prop_name, js_value_to_serde_value(&prop_val, cx))
}).collect();
Value::Object(props)
} else {
error!("Ignoring a value for provider state parameter as it can not be converted to a JSON type");
Value::Null
}
}

0 comments on commit df4df0b

Please sign in to comment.