mech_interpreter/stdlib/assign/
record.rs

1#[macro_use]
2use crate::stdlib::*;
3use self::assign::*;
4
5// x.a = 1 --------------------------------------------------------------------
6
7// Record Set -----------------------------------------------------------------
8
9#[derive(Debug)]
10pub struct RecordAssign<T> {
11  pub sink: Ref<T>,
12  pub source: Ref<T>,
13}
14impl<T> MechFunctionImpl for RecordAssign<T> 
15  where
16  T: Debug + Clone + Sync + Send + PartialEq + 'static,
17  Ref<T>: ToValue
18{
19  fn solve(&self) {
20    let source_ptr = self.source.as_ptr();
21    let sink_ptr = self.sink.as_mut_ptr();
22    unsafe {
23      *sink_ptr = (*source_ptr).clone();
24    }
25  }
26  fn out(&self) -> Value { self.sink.to_value() }
27  fn to_string(&self) -> String { format!("{:#?}", self) }
28}
29#[cfg(feature = "compiler")]
30impl<T> MechFunctionCompiler for RecordAssign<T> {
31  fn compile(&self, ctx: &mut CompileCtx) -> MResult<Register> {
32    todo!();
33  }
34}
35
36fn impl_set_record_column_fxn(sink: Value, source: Value, key: Value) -> MResult<Box<dyn MechFunction>> {
37  match (&sink, &source, &key) {
38    (Value::Record(rcrd),source,Value::Id(k)) => {
39      let rcrd_brrw = rcrd.borrow();
40      match (rcrd_brrw.data.get(k),source) {
41        #[cfg(all(feature = "bool", feature = "record"))]
42        (Some(Value::Bool(sink)), Value::Bool(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
43        #[cfg(all(feature = "i8", feature = "record"))]
44        (Some(Value::I8(sink)), Value::I8(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
45        #[cfg(all(feature = "i16", feature = "record"))]
46        (Some(Value::I16(sink)), Value::I16(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
47        #[cfg(all(feature = "i32", feature = "record"))]
48        (Some(Value::I32(sink)), Value::I32(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
49        #[cfg(all(feature = "i64", feature = "record"))]
50        (Some(Value::I64(sink)), Value::I64(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
51        #[cfg(all(feature = "i128", feature = "record"))]
52        (Some(Value::I128(sink)), Value::I128(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
53        #[cfg(all(feature = "u8", feature = "record"))]
54        (Some(Value::U8(sink)), Value::U8(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
55        #[cfg(all(feature = "u16", feature = "record"))]
56        (Some(Value::U16(sink)), Value::U16(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
57        #[cfg(all(feature = "u32", feature = "record"))]
58        (Some(Value::U32(sink)), Value::U32(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
59        #[cfg(all(feature = "u64", feature = "record"))]
60        (Some(Value::U64(sink)), Value::U64(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
61        #[cfg(all(feature = "u128", feature = "record"))]
62        (Some(Value::U128(sink)), Value::U128(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
63        #[cfg(all(feature = "f32", feature = "record"))]
64        (Some(Value::F32(sink)), Value::F32(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
65        #[cfg(all(feature = "f64", feature = "record"))]
66        (Some(Value::F64(sink)), Value::F64(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
67        #[cfg(all(feature = "string", feature = "record"))]
68        (Some(Value::String(sink)), Value::String(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
69        #[cfg(all(feature = "complex", feature = "record"))]
70        (Some(Value::ComplexNumber(sink)), Value::ComplexNumber(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
71        #[cfg(all(feature = "rational", feature = "record"))]
72        (Some(Value::RationalNumber(sink)), Value::RationalNumber(source)) => return Ok(Box::new(RecordAssign{sink: sink.clone(), source: source.clone()})),
73        _ => return Err(MechError {file: file!().to_string(),tokens: vec![],msg: "".to_string(),id: line!(),kind: MechErrorKind::UndefinedField(*k)}),
74      }
75    }
76    _ => return Err(MechError{file: file!().to_string(),tokens: vec![],msg: "".to_string(),id: line!(),kind: MechErrorKind::None}),
77  }
78}
79
80pub struct AssignRecordColumn {}
81impl NativeFunctionCompiler for AssignRecordColumn {
82  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
83    if arguments.len() < 3 {
84      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
85    }
86    let sink = arguments[0].clone();
87    let source = arguments[1].clone();
88    let key = arguments[2].clone();
89    match impl_set_record_column_fxn(sink.clone(), source.clone(), key.clone()) {
90      Ok(fxn) => Ok(fxn),
91      Err(_) => {
92        match (&sink,&source,&key) {
93          (Value::MutableReference(sink),_,_) => { impl_set_record_column_fxn(sink.borrow().clone(), source.clone(), key.clone()) }
94          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
95        }
96      }
97    }
98  }
99}