surrealdb_sql/fnc/script/
into.rs1use super::classes;
2use crate::number::Number;
3use crate::value::Value;
4use js::Array;
5use js::Class;
6use js::Ctx;
7use js::Error;
8use js::IntoJs;
9use js::Null;
10use js::Object;
11use js::Undefined;
12
13impl<'js> IntoJs<'js> for Value {
14 fn into_js(self, ctx: &Ctx<'js>) -> Result<js::Value<'js>, Error> {
15 (&self).into_js(ctx)
16 }
17}
18
19impl<'js> IntoJs<'js> for &Value {
20 fn into_js(self, ctx: &Ctx<'js>) -> Result<js::Value<'js>, Error> {
21 match self {
22 Value::Null => Null.into_js(ctx),
23 Value::None => Undefined.into_js(ctx),
24 Value::Bool(boolean) => Ok(js::Value::new_bool(ctx.clone(), *boolean)),
25 Value::Strand(v) => js::String::from_str(ctx.clone(), v)?.into_js(ctx),
26 Value::Number(Number::Int(v)) => Ok(js::Value::new_int(ctx.clone(), *v as i32)),
27 Value::Number(Number::Float(v)) => Ok(js::Value::new_float(ctx.clone(), *v)),
28 &Value::Number(Number::Decimal(v)) => match v.is_integer() {
29 true => Ok(js::Value::new_int(ctx.clone(), v.try_into().unwrap_or_default())),
30 false => Ok(js::Value::new_float(ctx.clone(), v.try_into().unwrap_or_default())),
31 },
32 Value::Datetime(v) => {
33 let date: js::function::Constructor = ctx.globals().get("Date")?;
34 date.construct((v.0.timestamp_millis(),))
35 }
36 Value::Thing(v) => Ok(Class::<classes::record::Record>::instance(
37 ctx.clone(),
38 classes::record::Record {
39 value: v.to_owned(),
40 },
41 )?
42 .into_value()),
43 Value::Duration(v) => Ok(Class::<classes::duration::Duration>::instance(
44 ctx.clone(),
45 classes::duration::Duration {
46 value: Some(v.to_owned()),
47 },
48 )?
49 .into_value()),
50 Value::Uuid(v) => Ok(Class::<classes::uuid::Uuid>::instance(
51 ctx.clone(),
52 classes::uuid::Uuid {
53 value: Some(v.to_owned()),
54 },
55 )?
56 .into_value()),
57 Value::Array(v) => {
58 let x = Array::new(ctx.clone())?;
59 for (i, v) in v.iter().enumerate() {
60 x.set(i, v)?;
61 }
62 x.into_js(ctx)
63 }
64 Value::Object(v) => {
65 let x = Object::new(ctx.clone())?;
66 for (k, v) in v.iter() {
67 x.set(k, v)?;
68 }
69 x.into_js(ctx)
70 }
71 _ => Undefined.into_js(ctx),
72 }
73 }
74}