rust_multistack/stdlib/
dup.rs

1use crate::ts::{TS};
2use rust_dynamic::value::Value;
3use easy_error::{Error, bail};
4
5pub fn stdlib_dup_in_current(ts: &mut TS, value1: Option<Value>, _value2: Option<Value>) -> Result<&mut TS, Error> {
6    match value1 {
7        Some(ndup) => {
8            match ndup.cast_int() {
9                Ok(n) => {
10                    return ts.dup_in_current_stack(n);
11                }
12                Err(err) => {
13                    bail!("Operation dup() returned error: {}", err);
14                }
15            }
16        }
17        None => {
18            bail!("Number of operations is missed for a dup() operation");
19        }
20    }
21}
22
23pub fn stdlib_dup_many_in_current_inline(ts: &mut TS) -> Result<&mut TS, Error> {
24    if ts.current_stack_len() < 1 {
25        bail!("Stack is too shallow for inline dup_many()");
26    }
27    let n = ts.pull();
28    stdlib_dup_in_current(ts, n, None)
29}
30
31pub fn stdlib_dup_one_in_current_inline(ts: &mut TS) -> Result<&mut TS, Error> {
32    stdlib_dup_in_current(ts, Some(Value::from(1).unwrap()), None)
33}
34
35pub fn stdlib_dup_in_stack(ts: &mut TS, value1: Option<Value>, value2: Option<Value>) -> Result<&mut TS, Error> {
36    match value1 {
37        Some(name_val) => {
38            match name_val.cast_string() {
39                Ok(name) => {
40                    match value2 {
41                        Some(ndup) => {
42                            match ndup.cast_int() {
43                                Ok(n) => {
44                                    return ts.dup_in_stack(n, name);
45                                }
46                                Err(err) => {
47                                    bail!("Operation dup_in() returned error: {}", err);
48                                }
49                            }
50                        }
51                        None => {
52                            bail!("Number of operations is missed for a dup_in() operation");
53                        }
54                    }
55                }
56                Err(err) => {
57                    bail!("Operation dup_in() returned error: {}", err);
58                }
59            }
60        }
61        None => {
62            bail!("Name of stack is missed for a dup_in() operation");
63        }
64    }
65}
66
67pub fn stdlib_dup_many_in_stack_inline(ts: &mut TS) -> Result<&mut TS, Error> {
68    if ts.current_stack_len() < 2 {
69        bail!("Stack is too shallow for inline dup_many()");
70    }
71    let name = ts.pull();
72    let n = ts.pull();
73    stdlib_dup_in_stack(ts, name, n)
74}
75
76pub fn stdlib_dup_one_in_stack_inline(ts: &mut TS) -> Result<&mut TS, Error> {
77    if ts.current_stack_len() < 1 {
78        bail!("Stack is too shallow for inline dup_many()");
79    }
80    let name = ts.pull();
81    stdlib_dup_in_stack(ts, name, Some(Value::from(1).unwrap()))
82}
83
84pub fn init_stdlib(ts: &mut TS) {
85    let _ = ts.register_function("dup".to_string(), stdlib_dup_in_current);
86    let _ = ts.register_inline("dup_many".to_string(), stdlib_dup_many_in_current_inline);
87    let _ = ts.register_inline("dup_one".to_string(), stdlib_dup_one_in_current_inline);
88    let _ = ts.register_function("dup_in".to_string(), stdlib_dup_in_stack);
89    let _ = ts.register_inline("dup_many_in".to_string(), stdlib_dup_many_in_stack_inline);
90    let _ = ts.register_inline("dup_one_in".to_string(), stdlib_dup_one_in_stack_inline);
91}