1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use std::borrow::Cow;
use crate::{Direction, TypeName};
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct TealType {
pub(crate) name: Cow<'static, str>,
pub(crate) is_external: bool,
}
impl TealType {
fn new(name: Cow<'static, str>, is_external: bool) -> Self {
Self { name, is_external }
}
pub fn from<A: TypeName>(dir: Direction) -> Self {
Self::new(A::get_type_name(dir), A::is_external())
}
}
pub trait TealMultiValue {
fn get_types(dir: Direction) -> Vec<TealType>;
}
macro_rules! impl_teal_multi_value {
() => (
impl TealMultiValue for () {
fn get_types(_:Direction) -> Vec<TealType> {
Vec::new()
}
}
);
($($names:ident) +) => (
impl<$($names,)* > TealMultiValue for ($($names,)*)
where $($names: TypeName,)*
{
#[allow(unused_mut)]
#[allow(non_snake_case)]
fn get_types(dir:Direction) -> Vec<TealType>{
let types = vec![
$(TealType::from::<$names>(dir),)*
];
types
}
}
);
}
impl<A> TealMultiValue for A
where
A: TypeName,
{
#[allow(unused_mut)]
#[allow(non_snake_case)]
fn get_types(dir: Direction) -> Vec<TealType> {
vec![TealType::from::<A>(dir)]
}
}
impl_teal_multi_value!();
impl_teal_multi_value!(A);
impl_teal_multi_value!(A B);
impl_teal_multi_value!(A B C);
impl_teal_multi_value!(A B C D);
impl_teal_multi_value!(A B C D E);
impl_teal_multi_value!(A B C D E F);
impl_teal_multi_value!(A B C D E F G);
impl_teal_multi_value!(A B C D E F G H);
impl_teal_multi_value!(A B C D E F G H I);
impl_teal_multi_value!(A B C D E F G H I J);
impl_teal_multi_value!(A B C D E F G H I J K);
impl_teal_multi_value!(A B C D E F G H I J K L);
impl_teal_multi_value!(A B C D E F G H I J K L M);
impl_teal_multi_value!(A B C D E F G H I J K L M N);
impl_teal_multi_value!(A B C D E F G H I J K L M N O);
impl_teal_multi_value!(A B C D E F G H I J K L M N O P);