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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use super::*;
pub fn translate_enum(_enum_: &ItemEnum) -> syn::Result<TokenStream> {
todo!();
// let ItemEnum {
// vis,
// ident: trait_name,
// variants,
// ..
// } = enum_;
// let types: Vec<_> = variants
// .iter()
// .map(|variant| -> syn::Result<_> {
// let Variant {
// ident: type_name,
// fields,
// ..
// } = variant;
// let generics = match fields {
// Fields::Unit => vec![],
// Fields::Unnamed(unnamed) => {
// let generics: Vec<_> = unnamed
// .unnamed
// .iter()
// .enumerate()
// .map(|(index, field)| -> syn::Result<_> {
// let Field { ty, .. } = field;
// let generic_name = format_ident!("T{}", index);
// let trait_bounds = ty_to_trait_bounds(ty)?;
// Ok((generic_name, trait_bounds))
// })
// .try_collect()?;
// generics
// }
// Fields::Named(named) => {
// let generics: Vec<_> = named
// .named
// .iter()
// .map(|field| -> syn::Result<_> {
// let Field { ident, ty, .. } = field;
// let generic_name = ident.to_owned().unwrap();
// let trait_bounds = ty_to_trait_bounds(ty)?;
// Ok((generic_name.to_owned(), trait_bounds))
// })
// .try_collect()?;
// generics
// }
// };
// Ok((type_name, generics))
// })
// .try_collect()?;
// let impls = {
// let items: Vec<_> = types
// .into_iter()
// .map(|(type_name, generics)| {
// let generic_args = {
// let names: Vec<_> = generics.iter().map(|(name, _)| name).collect();
// quote! {
// #(#names),*
// }
// };
// let where_clause = {
// let bounds: Vec<_> = generics
// .iter()
// .filter_map(|(name, bounds)| {
// if bounds.is_empty() {
// None
// } else {
// Some(quote! {
// #name: #(#bounds)+*
// })
// }
// })
// .collect();
// quote! {
// #(#bounds),*
// }
// };
// quote! {
// #vis struct #type_name<#generic_args>
// where
// #where_clause
// {
// _phantom: ::core::marker::PhantomData<#generic_args>
// }
// impl<#generic_args> #trait_name for #type_name<#generic_args>
// where
// #where_clause
// {}
// }
// })
// .collect();
// quote! {
// #(#items)*
// }
// };
// let expanded = quote! {
// #vis trait #trait_name {}
// #impls
// };
// Ok(expanded)
}