1use crate::{BuiltinFunc, Object};
2use std::rc::Rc;
3
4lazy_static! {
5 pub static ref BuiltIns: Vec<(&'static str, BuiltinFunc)> = vec![
6 ("len", len),
7 ("puts", puts),
8 ("first", first),
9 ("last", last),
10 ("rest", rest),
11 ("push", push),
12 ("print", puts)
13 ];
14}
15
16pub fn len(args: Vec<Rc<Object>>) -> Rc<Object> {
23 if args.len() != 1 {
24 return Rc::from(Object::Error(format!(
25 "builtin len expected 1 argument, got {}",
26 args.len()
27 )));
28 }
29 Rc::from(match &*args[0] {
30 Object::String(s) => Object::Integer(s.len() as i64),
31 Object::Array(a) => Object::Integer(a.len() as i64),
32 o => Object::Error(format!("builtin len not supported for for type {}", o)),
33 })
34}
35
36pub fn puts(args: Vec<Rc<Object>>) -> Rc<Object> {
37 args.iter().for_each(|obj| println!("{}", obj));
38 Rc::from(Object::Null)
39}
40
41pub fn first(args: Vec<Rc<Object>>) -> Rc<Object> {
42 match &*args[0] {
43 Object::Array(s) => match s.first() {
44 Some(obj) => Rc::clone(obj),
45 None => Rc::new(Object::Null),
46 },
47 o => Rc::new(Object::Error(format!("builtin first not supported for for type {}", o))),
48 }
49}
50
51pub fn last(args: Vec<Rc<Object>>) -> Rc<Object> {
52 match &*args[0] {
53 Object::Array(s) => match s.last() {
54 Some(obj) => Rc::clone(obj),
55 None => Rc::new(Object::Null),
56 },
57 o => Rc::new(Object::Error(format!("builtin last not supported for for type {}", o))),
58 }
59}
60
61pub fn rest(args: Vec<Rc<Object>>) -> Rc<Object> {
62 match &*args[0] {
63 Object::Array(s) => {
64 let len = s.len();
65 if len > 0 {
66 let new_array = s[1..len].to_vec();
67 return Rc::new(Object::Array(new_array));
68 }
69 return Rc::new(Object::Null);
70 }
71 o => Rc::new(Object::Error(format!("builtin rest not supported for for type {}", o))),
72 }
73}
74
75pub fn push(args: Vec<Rc<Object>>) -> Rc<Object> {
76 let array = args.first().unwrap();
77 let obj = Rc::clone(args.last().unwrap());
78 match &**array {
79 Object::Array(s) => {
80 let mut new_array = s.clone();
81 new_array.push(obj);
82 return Rc::new(Object::Array(new_array));
83 }
84 o => Rc::new(Object::Error(format!("builtin push not supported for for type {}", o))),
85 }
86}