yttrium_std_parameter/
lib.rs

1#![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
21/*
22Parameters:
23Optional, the string to split on. If empty returns the entire parameter string
24Required, the index of the split string to return
25*/
26fn 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(&parameter[0]) {
57						//This is hacky and I don't like this
58						let split = event.parameter.split(&parameter[0]).map(String::from).collect();
59						event.split_parameters.insert(parameter[0].clone(), split);
60					}
61					let split = event.split_parameters.get(&parameter[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}