moon_script/function/
mod.rs

1use 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
10/// Allows to turn values to [crate::function::MoonFunction], but you shouldn't try to implement
11/// this.
12pub trait ToAbstractFunction<Params, Return, Function, Dummy> {
13
14    /// Turns this object into a [crate::function::MoonFunction]
15    fn abstract_function(self) -> MoonFunction;
16
17    /// Placeholder
18    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}