moon_script/function/
mod.rs1use alloc::fmt::{Debug, Formatter};
2use alloc::string::ToString;
3use alloc::sync::Arc;
4
5use paste::paste;
6
7use crate::execution::RuntimeError;
8use crate::value::MoonValue;
9
10pub trait ToAbstractFunction<Params, Return, Function, Dummy> {
13
14 fn abstract_function(self) -> MoonFunction;
16
17 fn dummy(_params: Params, _return_value: Return, _dummy: Dummy) {}
19}
20
21#[derive(Clone)]
22pub struct MoonFunction {
23 function: Arc<dyn Fn(&mut dyn Iterator<Item=Result<MoonValue, RuntimeError>>) -> Result<MoonValue, RuntimeError> + Send + Sync>,
24 number_of_params: usize,
25}
26
27impl PartialEq for MoonFunction{
28 fn eq(&self, other: &Self) -> bool {
29 self.number_of_params == other.number_of_params
30 }
31}
32
33impl Debug for MoonFunction {
34 fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
35 f.debug_struct("MoonFunction")
36 .field("Function", &Arc::as_ptr(&self.function))
37 .field("Number of params", &self.number_of_params)
38 .finish()
39 }
40}
41
42impl MoonFunction {
43 #[inline]
44 pub(crate) fn execute_iter<'values, ValuesIter>(&self, mut values: ValuesIter) -> Result<MoonValue, RuntimeError> where ValuesIter: Iterator<Item=Result<MoonValue, RuntimeError>> {
45 (self.function)(&mut values)
46 }
47
48 #[inline]
49 pub(crate) fn execute_into_iter<'values, ValuesIter>(&self, values: ValuesIter) -> Result<MoonValue, RuntimeError> where ValuesIter: IntoIterator<Item=Result<MoonValue, RuntimeError>> {
50 (self.function)(&mut values.into_iter())
51 }
52}
53
54macro_rules! impl_to_wrapped_function {
55 (def { n: $params_len:literal names: $($param_names:ident)* }) => {
56 paste!{
57 impl<$($param_names, [<Error $param_names>], )* TReturn, TFunction, TError: ToString,>
58 ToAbstractFunction<($($param_names,)*), TReturn, TFunction, u8> for TFunction
59 where $($param_names: TryFrom<MoonValue, Error=[<Error $param_names>] > + 'static,)*
60 TReturn: Into<MoonValue> + 'static,
61 TFunction: Fn($($param_names),*) -> Result<TReturn,TError> + 'static + Send + Sync
62 {
63 #[allow(unused_mut)]
64 #[allow(unused)]
65 fn abstract_function(self) -> MoonFunction {
66 MoonFunction {
67 function: Arc::new(move |values| {
68 $(let paste::item!{[<$param_names:lower>]} = <$param_names>::try_from(values.next()
69 .ok_or_else(|| RuntimeError::AnArgumentIsMissing{} )??)
70 .map_err(|_| RuntimeError::CannotParseArgument{} )?;)*
71
72 self($( paste::item!{[<$param_names:lower>]} ),*)
73 .map(|return_value| return_value.into())
74 .map_err(|err| RuntimeError::FunctionError{ function_error_message:err.to_string() })
75 }),
76 number_of_params: $params_len,
77 }
78 }
79 }
80
81 impl<$($param_names, [<Error $param_names>], )* TReturn, TFunction>
82 ToAbstractFunction<($($param_names,)*), TReturn, TFunction, u16> for TFunction
83 where $($param_names: TryFrom<MoonValue, Error=[<Error $param_names>]> + 'static,)*
84 TReturn: Into<MoonValue> + 'static,
85 TFunction: Fn($($param_names),*) -> TReturn + 'static + Send + Sync
86 {
87 #[allow(unused_mut)]
88 #[allow(unused)]
89 fn abstract_function(self) -> MoonFunction {
90 MoonFunction {
91 function: Arc::new(move |values| {
92 $(let paste::item!{[<$param_names:lower>]} = <$param_names>::try_from(values.next()
93 .ok_or_else(|| RuntimeError::AnArgumentIsMissing{} )??)
94 .map_err(|_| RuntimeError::CannotParseArgument{} )?;)*
95
96 Ok(self($( paste::item!{[<$param_names:lower>]} ),*)
97
98 .into())
99 }),
100 number_of_params: $params_len,
101 }
102 }
103 }
104 }
105 };
106
107 ($(def { n: $params_len:literal names: $($param_names:ident)* })*) =>{
108 $(impl_to_wrapped_function!{def { n: $params_len names: $($param_names)* }})*
109 };
110}
111
112
113impl_to_wrapped_function! {
114 def { n: 00 names: }
115 def { n: 01 names: PA }
116 def { n: 02 names: PA PB }
117 def { n: 03 names: PA PB PC }
118 def { n: 04 names: PA PB PC PD }
119 def { n: 05 names: PA PB PC PD PE }
120 def { n: 06 names: PA PB PC PD PE PF }
121 def { n: 07 names: PA PB PC PD PE PF PG }
122 def { n: 08 names: PA PB PC PD PE PF PG PH }
123}
124
125#[cfg(feature = "medium_functions")]
126impl_to_wrapped_function! {
127 def { n: 09 names: PA PB PC PD PE PF PG PH PI }
128 def { n: 10 names: PA PB PC PD PE PF PG PH PI PJ }
129 def { n: 11 names: PA PB PC PD PE PF PG PH PI PJ PK }
130 def { n: 12 names: PA PB PC PD PE PF PG PH PI PJ PK PL }
131 def { n: 13 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM }
132 def { n: 14 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN }
133 def { n: 15 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO }
134 def { n: 16 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP }
135}
136
137#[cfg(feature = "big_functions")]
138impl_to_wrapped_function! {
139 def { n: 17 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ }
140 def { n: 18 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR }
141 def { n: 19 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS }
142 def { n: 20 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU }
143 def { n: 21 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV }
144 def { n: 22 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT }
145 def { n: 23 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW }
146 def { n: 24 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX }
147}
148
149#[cfg(feature = "massive_functions")]
150impl_to_wrapped_function! {
151 def { n: 25 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ }
152 def { n: 26 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY }
153 def { n: 27 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA }
154 def { n: 28 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB }
155 def { n: 29 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC }
156 def { n: 30 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD }
157 def { n: 31 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE }
158 def { n: 32 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF }
159 def { n: 33 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG }
160 def { n: 34 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG PAH }
161 def { n: 35 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG PAH PAI }
162 def { n: 36 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG PAH PAI PAJ }
163 def { n: 37 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG PAH PAI PAJ PAK }
164 def { n: 38 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG PAH PAI PAJ PAK PAL }
165 def { n: 39 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG PAH PAI PAJ PAK PAL PAM }
166 def { n: 40 names: PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PU PV PT PW PX PZ PY PAA PAB PAC PAD PAE PAF PAG PAH PAI PAJ PAK PAL PAM PAN }
167}