script_bindings/
constant.rs1use std::ffi::CStr;
8
9use js::context::JSContext;
10use js::jsapi::{JSPROP_ENUMERATE, JSPROP_PERMANENT, JSPROP_READONLY};
11use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value};
12use js::rooted;
13use js::rust::HandleObject;
14use js::rust::wrappers2::JS_DefineProperty;
15
16#[derive(Clone)]
18pub struct ConstantSpec {
19 pub name: &'static CStr,
21 pub value: ConstantVal,
23}
24
25#[derive(Clone)]
27#[expect(dead_code)]
28pub enum ConstantVal {
29 Int(i32),
31 Uint(u32),
33 Double(f64),
35 Bool(bool),
37 Null,
39}
40
41impl ConstantSpec {
42 pub fn get_value(&self) -> JSVal {
44 match self.value {
45 ConstantVal::Null => NullValue(),
46 ConstantVal::Int(i) => Int32Value(i),
47 ConstantVal::Uint(u) => UInt32Value(u),
48 ConstantVal::Double(d) => DoubleValue(d),
49 ConstantVal::Bool(b) => BooleanValue(b),
50 }
51 }
52}
53
54pub fn define_constants(cx: &mut JSContext, obj: HandleObject, constants: &[ConstantSpec]) {
57 for spec in constants {
58 rooted!(&in(cx) let value = spec.get_value());
59 unsafe {
60 assert!(JS_DefineProperty(
61 cx,
62 obj,
63 spec.name.as_ptr(),
64 value.handle(),
65 (JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT) as u32
66 ));
67 }
68 }
69}