1use 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
18pub trait ScriptArgument: ArgMeta + FromScript + GetTypeDependencies {}
20impl<T: ArgMeta + FromScript + GetTypeDependencies> ScriptArgument for T {}
21
22pub trait TypedScriptArgument: TypedThrough + ScriptArgument {}
24impl<T: TypedThrough + ScriptArgument> TypedScriptArgument for T {}
25
26pub trait ScriptReturn: IntoScript + GetTypeDependencies {}
28impl<T: IntoScript + GetTypeDependencies> ScriptReturn for T {}
29
30pub trait TypedScriptReturn: TypedThrough + ScriptReturn {}
32impl<T: TypedThrough + ScriptReturn> TypedScriptReturn for T {}
33
34pub trait ArgMeta {
36 fn default_value() -> Option<ScriptValue> {
38 None
39 }
40
41 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 {}