aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2020-04-10 15:46:28 -0700
committerManish Goregaokar <manishsmail@gmail.com>2020-04-11 00:15:43 -0700
commit10a13ffa2016cb81419ae4aa622815f8645ad7f1 (patch)
tree9be061a80329ddac9c872a786aaafbce2c37cec2 /components/script/dom/bindings/codegen/CodegenRust.py
parent37023b24f256f7defd605e90e0873afee9197a1e (diff)
downloadservo-10a13ffa2016cb81419ae4aa622815f8645ad7f1.tar.gz
servo-10a13ffa2016cb81419ae4aa622815f8645ad7f1.zip
Implement FromJSValConvertible on enums
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 96947d83ec7..a9642250770 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -4347,8 +4347,12 @@ pub enum %s {
pairs = ",\n ".join(['("%s", super::%s::%s)' % (val, ident, getEnumValueName(val)) for val in enum.values()])
inner = string.Template("""\
+use crate::dom::bindings::conversions::ConversionResult;
+use crate::dom::bindings::conversions::FromJSValConvertible;
use crate::dom::bindings::conversions::ToJSValConvertible;
+use crate::dom::bindings::utils::find_enum_value;
use js::jsapi::JSContext;
+use js::rust::HandleValue;
use js::rust::MutableHandleValue;
use js::jsval::JSVal;
@@ -4373,6 +4377,22 @@ impl ToJSValConvertible for super::${ident} {
pairs[*self as usize].0.to_jsval(cx, rval);
}
}
+
+impl FromJSValConvertible for super::${ident} {
+ type Config = ();
+ unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, _option: ())
+ -> Result<ConversionResult<super::${ident}>, ()> {
+ match find_enum_value(cx, value, pairs) {
+ Err(_) => Err(()),
+ Ok((None, search)) => {
+ Ok(ConversionResult::Failure(
+ format!("'{}' is not a valid enum value for enumeration '${ident}'.", search).into()
+ ))
+ }
+ Ok((Some(&value), _)) => Ok(ConversionResult::Success(value)),
+ }
+ }
+}
""").substitute({
'ident': ident,
'pairs': pairs