| 903 | } |
| 904 | |
| 905 | pub fn apply_func(helper: &MyHelper, func: &str, args: Vec<IDLValue>) -> Result<IDLValue> { |
| 906 | match helper.func_env.0.get(func) { |
| 907 | None => Err(anyhow!("Unknown function {}", func)), |
| 908 | Some((formal_args, body)) => { |
| 909 | if formal_args.len() != args.len() { |
| 910 | return Err(anyhow!( |
| 911 | "{} expects {} arguments, but {} is provided", |
| 912 | func, |
| 913 | formal_args.len(), |
| 914 | args.len() |
| 915 | )); |
| 916 | } |
| 917 | let mut helper = helper.spawn(); |
| 918 | for (id, v) in formal_args.iter().zip(args) { |
| 919 | helper.env.0.insert(id.to_string(), v); |
| 920 | } |
| 921 | for cmd in body.iter() { |
| 922 | cmd.clone().run(&mut helper)?; |
| 923 | } |
| 924 | let res = helper.env.0.get("_").unwrap_or(&IDLValue::Null).clone(); |
| 925 | Ok(res) |
| 926 | } |
| 927 | } |
| 928 | } |
| 929 | #[tokio::main(flavor = "multi_thread", worker_threads = 10)] |
| 930 | async fn parallel_calls( |
| 931 | futures: Vec<impl std::future::Future<Output = anyhow::Result<IDLArgs>>>, |