yttrium_std_parameter/
lib.rs1#![allow(clippy::needless_return)]
2#![deny(clippy::implicit_return)]
3use yttrium_key_base as key_base;
4#[cfg(feature = "loader")]
5#[no_mangle]
6pub fn key_create() -> *mut dyn key_base::Key {
7 return Box::into_raw(Box::new(std_parameter {
8 info: create_key_info(),
9 function: key_function,
10 }));
11}
12
13pub fn safe_create() -> Box<dyn key_base::Key> {
14 return Box::new(std_parameter {
15 info: create_key_info(),
16 function: key_function,
17 });
18}
19
20
21fn create_key_info() -> key_base::KeyInfo {
27 return key_base::KeyInfo {
28 name: String::from("parameter"),
29 parameters_required: vec![0, 2],
30 };
31}
32
33#[allow(non_camel_case_types)]
34struct std_parameter {
35 pub info: key_base::KeyInfo,
36 pub function: fn(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String>,
37}
38
39impl key_base::Key for std_parameter {
40 fn get_key_info(&self) -> &key_base::KeyInfo {
41 return &self.info;
42 }
43
44 fn get_key_function(&self) -> fn(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String> {
45 return self.function;
46 }
47}
48
49fn key_function(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String> {
50 if let key_base::environment::events::EventType::Message(event) = &mut environment.event_info {
51 if parameter.is_empty() {
52 return Ok(event.parameter.clone());
53 } else {
54 match parameter[1].parse::<usize>() {
55 Ok(index) => {
56 if !event.split_parameters.contains_key(¶meter[0]) {
57 let split = event.parameter.split(¶meter[0]).map(String::from).collect();
59 event.split_parameters.insert(parameter[0].clone(), split);
60 }
61 let split = event.split_parameters.get(¶meter[0]).unwrap();
62 if split.len() >= index + 1 {
63 return Ok(split[index].clone());
64 } else {
65 return Err(format!("`parameter` split by `{}` didn't have `{}` elements", parameter[0], index + 1));
66 }
67 }
68 Err(error) => {
69 return Err(format!("Invalid number passed to `parameter`: `{}`", error.to_string()));
70 }
71 }
72 }
73 } else {
74 return Err(String::from("`parameter` called on invalid event type"));
75 }
76}