extern crate oters_lang; use oters_lang as oters; extern crate oters_macro; use oters_lang::export::Value; use oters_lang::export::{export_list, export_oters}; use std::collections::HashMap; #[export_oters] struct Circle { pos: (i64, i64), r: f64, } #[export_oters] struct Color { r: i64, g: i64, b: i64, a: i64, } #[export_oters] enum IntOption { None, Some(i64), } #[export_oters] enum Shape { Circle((i64, i64), i64, Color), Rect((i64, i64), (i64, i64)), Line((i64, i64), (i64, i64)), } #[export_oters] fn circ_area(c: Circle) -> f64 { c.r * c.r * 3.14159265358979 } #[export_oters] fn shape_area(s: Shape) -> f64 { match s { Shape::Circle(_, r, _) => r as f64 * r as f64 * 3.14159265358979, Shape::Rect(_, dims) => (dims.0 * dims.1) as f64, Shape::Line(_, _) => 0.0, } } #[export_oters] fn print_int(i: i64) { println!("{}", i); } #[export_oters] fn int_sum(i1: i64, i2: i64) -> i64 { i1 + i2 } #[export_oters] fn list_sum(xs: Vec) -> i64 { xs.into_iter().sum() } #[export_oters] fn add_one(xs: Vec) -> Vec { xs.into_iter().map(|i| i + 1).collect::>() } #[export_oters] fn do_nothing(tup: (i64, f64, String)) -> (i64, f64, String) { tup } export_list!(); fn main() { let list = vec![ Box::new(Value::Int(1)), Box::new(Value::Int(2)), Box::new(Value::Int(3)), ]; let list = Value::List(list); let tup = Value::Tuple(vec![ Box::new(Value::Int(24)), Box::new(Value::Float(3.14)), Box::new(Value::String("Hello, world!".to_string())), ]); println!("{:?}", *EXPORT_FNS); println!( "{:?}", EXPORT_FNS.get("list_sum").unwrap().0(vec![list.clone()]) ); println!( "{:?}", EXPORT_FNS.get("add_one").unwrap().0(vec![list.clone()]) ); println!("{:?}", EXPORT_FNS.get("do_nothing").unwrap().0(vec![tup])); println!( "{:?}", EXPORT_FNS.get("circ_area").unwrap().0(vec![Value::Struct( "Circle".to_string(), HashMap::from([ ( "pos".to_string(), Box::new(Value::Tuple(vec![ Box::new(Value::Int(10)), Box::new(Value::Int(10)) ])) ), ("r".to_string(), Box::new(Value::Float(2.0))) ]) )]) ); println!( "{:?}", EXPORT_FNS.get("shape_area").unwrap().0(vec![Value::Variant( "Rect".to_string(), Some(Box::new(Value::Tuple(vec![ Box::new(Value::Tuple(vec![ Box::new(Value::Int(100)), Box::new(Value::Int(100)) ])), Box::new(Value::Tuple(vec![ Box::new(Value::Int(24)), Box::new(Value::Int(24)) ])) ]))) )]) ) }