Skip to main content

bevy_mod_scripting_bindings/function/
arg_meta.rs

1//! Trait implementations to help with function dispatch.
2
3use std::{collections::VecDeque, ffi::OsString, path::PathBuf};
4
5use bevy_platform::collections::HashMap;
6
7use crate::{
8    ReflectReference, ScriptValue, VariadicTuple, docgen::TypedThrough, error::InteropError,
9};
10
11use super::{
12    from::{FromScript, M, R, Union, V},
13    into::IntoScript,
14    script_function::{DynamicScriptFunction, DynamicScriptFunctionMut, FunctionCallContext},
15    type_dependencies::GetTypeDependencies,
16};
17
18/// Marker trait for types that can be used as arguments to a script function.
19pub trait ScriptArgument: ArgMeta + FromScript + GetTypeDependencies {}
20impl<T: ArgMeta + FromScript + GetTypeDependencies> ScriptArgument for T {}
21
22/// Marker trait for types that can be used as arguments to a script function. And contain type information.
23pub trait TypedScriptArgument: TypedThrough + ScriptArgument {}
24impl<T: TypedThrough + ScriptArgument> TypedScriptArgument for T {}
25
26/// Marker trait for types that can be used as return values from a script function.
27pub trait ScriptReturn: IntoScript + GetTypeDependencies {}
28impl<T: IntoScript + GetTypeDependencies> ScriptReturn for T {}
29
30/// Marker trait for types that can be used as return values from a script function. And contain type information.
31pub trait TypedScriptReturn: TypedThrough + ScriptReturn {}
32impl<T: TypedThrough + ScriptReturn> TypedScriptReturn for T {}
33
34/// Describes an argument to a script function. Provides necessary information for the function to handle dispatch.
35pub trait ArgMeta {
36    /// The default value for the argument. Used when the argument is not provided.
37    fn default_value() -> Option<ScriptValue> {
38        None
39    }
40
41    /// If returns true, will absorb all arguments following itself
42    fn variadic() -> bool {
43        false
44    }
45}
46
47impl ArgMeta for ScriptValue {}
48
49impl ArgMeta for VariadicTuple {
50    fn default_value() -> Option<ScriptValue> {
51        Some(ScriptValue::Tuple(Default::default()))
52    }
53
54    fn variadic() -> bool {
55        true
56    }
57}
58
59macro_rules! impl_arg_info {
60    ($($ty:ty),*) => {
61        $(
62            impl ArgMeta for $ty {}
63        )*
64    };
65}
66
67impl_arg_info!(
68    bool,
69    i8,
70    i16,
71    i32,
72    i64,
73    i128,
74    u8,
75    u16,
76    u32,
77    u64,
78    u128,
79    f32,
80    f64,
81    usize,
82    isize,
83    String,
84    PathBuf,
85    OsString,
86    char,
87    ReflectReference,
88    &'static str
89);
90
91impl<T1, T2> ArgMeta for Union<T1, T2> {}
92impl<T> ArgMeta for V<T> {}
93impl<T> ArgMeta for R<'_, T> {}
94impl<T> ArgMeta for M<'_, T> {}
95
96impl<T> ArgMeta for Result<T, InteropError> {}
97
98impl<T> ArgMeta for Option<T> {
99    fn default_value() -> Option<ScriptValue> {
100        Some(ScriptValue::Unit)
101    }
102}
103
104impl<T> ArgMeta for Vec<T> {}
105impl<T> ArgMeta for VecDeque<T> {}
106
107impl<T, const N: usize> ArgMeta for [T; N] {}
108
109impl<K, V> ArgMeta for HashMap<K, V> {}
110impl<K, V> ArgMeta for std::collections::HashMap<K, V> {}
111
112impl_arg_info!(DynamicScriptFunction, DynamicScriptFunctionMut);
113
114impl ArgMeta for () {
115    fn default_value() -> Option<ScriptValue> {
116        Some(ScriptValue::Unit)
117    }
118}
119impl<T> ArgMeta for (T,) {}
120impl<T1, T2> ArgMeta for (T1, T2) {}
121impl<T1, T2, T3> ArgMeta for (T1, T2, T3) {}
122impl<T1, T2, T3, T4> ArgMeta for (T1, T2, T3, T4) {}
123impl<T1, T2, T3, T4, T5> ArgMeta for (T1, T2, T3, T4, T5) {}
124impl<T1, T2, T3, T4, T5, T6> ArgMeta for (T1, T2, T3, T4, T5, T6) {}
125impl<T1, T2, T3, T4, T5, T6, T7> ArgMeta for (T1, T2, T3, T4, T5, T6, T7) {}
126impl<T1, T2, T3, T4, T5, T6, T7, T8> ArgMeta for (T1, T2, T3, T4, T5, T6, T7, T8) {}
127impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> ArgMeta for (T1, T2, T3, T4, T5, T6, T7, T8, T9) {}
128impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ArgMeta
129    for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
130{
131}
132impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ArgMeta
133    for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
134{
135}
136impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ArgMeta
137    for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
138{
139}
140impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ArgMeta
141    for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)
142{
143}
144
145impl ArgMeta for FunctionCallContext {}