1use std::{ops::Deref, str::FromStr};
2
3use proc_macro2::Ident;
4use syn::{parse_str, ItemTrait};
5
6#[derive(Debug)]
7pub enum StandardTrait {
8 AbcTrait,
9 Any,
10 Borrow,
11 BorrowMut,
12 Eq,
13 AsMut,
14 AsRef,
15 From,
16 Into,
17 TryFrom,
18 TryInto,
19 Default,
20 Binary,
21 Debug,
22 Display,
23 LowerExp,
24 LowerHex,
25 Octal,
26 Pointer,
27 UpperExp,
28 UpperHex,
29 Future,
30 IntoFuture,
31 FromIterator,
32 FusedIterator,
33 IntoIterator,
34 Product,
35 Sum,
36 Copy,
37 Sized,
38 ToSocketAddrs,
39 Add,
40 AddAssign,
41 BitAnd,
42 BitAndAssign,
43 BitOr,
44 BitOrAssign,
45 BitXor,
46 BitXorAssign,
47 Deref,
48 DerefMut,
49 Div,
50 DivAssign,
51 Drop,
52 Fn,
53 FnMut,
54 FnOnce,
55 Index,
56 IndexMut,
57 Mul,
58 MulAssign,
59 MultiMethod,
60 Neg,
61 Not,
62 Rem,
63 RemAssign,
64 Shl,
65 ShlAssign,
66 Shr,
67 ShrAssign,
68 Sub,
69 SubAssign,
70 Termination,
71 SliceIndex,
72 FromStr,
73 ToString,
74}
75
76#[repr(transparent)]
77#[derive(Clone, Hash, Debug)]
78pub struct TraitSchematic(pub ItemTrait);
79
80impl From<StandardTrait> for TraitSchematic {
81 fn from(value: StandardTrait) -> Self {
82 TraitSchematic(
83 match value {
84 StandardTrait::AbcTrait => parse_str(include_str!("./AbcTrait.rs")),
85 StandardTrait::Any => parse_str(include_str!("./Any.rs")),
86 StandardTrait::Borrow => parse_str(include_str!("./Borrow.rs")),
87 StandardTrait::BorrowMut => parse_str(include_str!("./BorrowMut.rs")),
88 StandardTrait::Eq => parse_str(include_str!("./Eq.rs")),
89 StandardTrait::AsMut => parse_str(include_str!("./AsMut.rs")),
90 StandardTrait::AsRef => parse_str(include_str!("./AsRef.rs")),
91 StandardTrait::From => parse_str(include_str!("./From.rs")),
92 StandardTrait::Into => parse_str(include_str!("./Into.rs")),
93 StandardTrait::TryFrom => parse_str(include_str!("./TryFrom.rs")),
94 StandardTrait::TryInto => parse_str(include_str!("./TryInto.rs")),
95 StandardTrait::Default => parse_str(include_str!("./Default.rs")),
96 StandardTrait::Binary => parse_str(include_str!("./Binary.rs")),
97 StandardTrait::Debug => parse_str(include_str!("./Debug.rs")),
98 StandardTrait::Display => parse_str(include_str!("./Display.rs")),
99 StandardTrait::LowerExp => parse_str(include_str!("./LowerExp.rs")),
100 StandardTrait::LowerHex => parse_str(include_str!("./LowerHex.rs")),
101 StandardTrait::Octal => parse_str(include_str!("./Octal.rs")),
102 StandardTrait::Pointer => parse_str(include_str!("./Pointer.rs")),
103 StandardTrait::UpperExp => parse_str(include_str!("./UpperExp.rs")),
104 StandardTrait::UpperHex => parse_str(include_str!("./UpperHex.rs")),
105 StandardTrait::Future => parse_str(include_str!("./Future.rs")),
106 StandardTrait::IntoFuture => parse_str(include_str!("./IntoFuture.rs")),
107 StandardTrait::FromIterator => parse_str(include_str!("./FromIterator.rs")),
108 StandardTrait::FusedIterator => parse_str(include_str!("./FusedIterator.rs")),
109 StandardTrait::IntoIterator => parse_str(include_str!("./IntoIterator.rs")),
110 StandardTrait::Product => parse_str(include_str!("./Product.rs")),
111 StandardTrait::Sum => parse_str(include_str!("./Sum.rs")),
112 StandardTrait::Copy => parse_str(include_str!("./Copy.rs")),
113 StandardTrait::Sized => parse_str(include_str!("./Sized.rs")),
114 StandardTrait::ToSocketAddrs => parse_str(include_str!("./ToSocketAddrs.rs")),
115 StandardTrait::Add => parse_str(include_str!("./Add.rs")),
116 StandardTrait::AddAssign => parse_str(include_str!("./AddAssign.rs")),
117 StandardTrait::BitAnd => parse_str(include_str!("./BitAnd.rs")),
118 StandardTrait::BitAndAssign => parse_str(include_str!("./BitAndAssign.rs")),
119 StandardTrait::BitOr => parse_str(include_str!("./BitOr.rs")),
120 StandardTrait::BitOrAssign => parse_str(include_str!("./BitOrAssign.rs")),
121 StandardTrait::BitXor => parse_str(include_str!("./BitXor.rs")),
122 StandardTrait::BitXorAssign => parse_str(include_str!("./BitXorAssign.rs")),
123 StandardTrait::Deref => parse_str(include_str!("./Deref.rs")),
124 StandardTrait::DerefMut => parse_str(include_str!("./DerefMut.rs")),
125 StandardTrait::Div => parse_str(include_str!("./Div.rs")),
126 StandardTrait::DivAssign => parse_str(include_str!("./DivAssign.rs")),
127 StandardTrait::Drop => parse_str(include_str!("./Drop.rs")),
128 StandardTrait::Fn => parse_str(include_str!("./Fn.rs")),
129 StandardTrait::FnMut => parse_str(include_str!("./FnMut.rs")),
130 StandardTrait::FnOnce => parse_str(include_str!("./FnOnce.rs")),
131 StandardTrait::Index => parse_str(include_str!("./Index.rs")),
132 StandardTrait::IndexMut => parse_str(include_str!("./IndexMut.rs")),
133 StandardTrait::Mul => parse_str(include_str!("./Mul.rs")),
134 StandardTrait::MulAssign => parse_str(include_str!("./MulAssign.rs")),
135 StandardTrait::MultiMethod => parse_str(include_str!("./MultiMethod.rs")),
136 StandardTrait::Neg => parse_str(include_str!("./Neg.rs")),
137 StandardTrait::Not => parse_str(include_str!("./Not.rs")),
138 StandardTrait::Rem => parse_str(include_str!("./Rem.rs")),
139 StandardTrait::RemAssign => parse_str(include_str!("./RemAssign.rs")),
140 StandardTrait::Shl => parse_str(include_str!("./Shl.rs")),
141 StandardTrait::ShlAssign => parse_str(include_str!("./ShlAssign.rs")),
142 StandardTrait::Shr => parse_str(include_str!("./Shr.rs")),
143 StandardTrait::ShrAssign => parse_str(include_str!("./ShrAssign.rs")),
144 StandardTrait::Sub => parse_str(include_str!("./Sub.rs")),
145 StandardTrait::SubAssign => parse_str(include_str!("./SubAssign.rs")),
146 StandardTrait::Termination => parse_str(include_str!("./Termination.rs")),
147 StandardTrait::SliceIndex => parse_str(include_str!("./SliceIndex.rs")),
148 StandardTrait::FromStr => parse_str(include_str!("./FromStr.rs")),
149 StandardTrait::ToString => parse_str(include_str!("./ToString.rs")),
150 }
151 .expect("Std trait file should exist"),
152 )
153 }
154}
155
156impl FromStr for StandardTrait {
157 type Err = ();
158 fn from_str(value: &str) -> Result<Self, ()> {
159 match value {
160 "AbcTrait" => Ok(Self::AbcTrait),
161 "Any" => Ok(Self::Any),
162 "Borrow" => Ok(Self::Borrow),
163 "BorrowMut" => Ok(Self::BorrowMut),
164 "Eq" => Ok(Self::Eq),
165 "AsMut" => Ok(Self::AsMut),
166 "AsRef" => Ok(Self::AsRef),
167 "From" => Ok(Self::From),
168 "Into" => Ok(Self::Into),
169 "TryFrom" => Ok(Self::TryFrom),
170 "TryInto" => Ok(Self::TryInto),
171 "Default" => Ok(Self::Default),
172 "Binary" => Ok(Self::Binary),
173 "Debug" => Ok(Self::Debug),
174 "Display" => Ok(Self::Display),
175 "LowerExp" => Ok(Self::LowerExp),
176 "LowerHex" => Ok(Self::LowerHex),
177 "Octal" => Ok(Self::Octal),
178 "Pointer" => Ok(Self::Pointer),
179 "UpperExp" => Ok(Self::UpperExp),
180 "UpperHex" => Ok(Self::UpperHex),
181 "Future" => Ok(Self::Future),
182 "IntoFuture" => Ok(Self::IntoFuture),
183 "FromIterator" => Ok(Self::FromIterator),
184 "FusedIterator" => Ok(Self::FusedIterator),
185 "IntoIterator" => Ok(Self::IntoIterator),
186 "Product" => Ok(Self::Product),
187 "Sum" => Ok(Self::Sum),
188 "Copy" => Ok(Self::Copy),
189 "Sized" => Ok(Self::Sized),
190 "ToSocketAddrs" => Ok(Self::ToSocketAddrs),
191 "Add" => Ok(Self::Add),
192 "AddAssign" => Ok(Self::AddAssign),
193 "BitAnd" => Ok(Self::BitAnd),
194 "BitAndAssign" => Ok(Self::BitAndAssign),
195 "BitOr" => Ok(Self::BitOr),
196 "BitOrAssign" => Ok(Self::BitOrAssign),
197 "BitXor" => Ok(Self::BitXor),
198 "BitXorAssign" => Ok(Self::BitXorAssign),
199 "Deref" => Ok(Self::Deref),
200 "DerefMut" => Ok(Self::DerefMut),
201 "Div" => Ok(Self::Div),
202 "DivAssign" => Ok(Self::DivAssign),
203 "Drop" => Ok(Self::Drop),
204 "Fn" => Ok(Self::Fn),
205 "FnMut" => Ok(Self::FnMut),
206 "FnOnce" => Ok(Self::FnOnce),
207 "Index" => Ok(Self::Index),
208 "IndexMut" => Ok(Self::IndexMut),
209 "Mul" => Ok(Self::Mul),
210 "MulAssign" => Ok(Self::MulAssign),
211 "MultiMethod" => Ok(Self::MultiMethod),
212 "Neg" => Ok(Self::Neg),
213 "Not" => Ok(Self::Not),
214 "Rem" => Ok(Self::Rem),
215 "RemAssign" => Ok(Self::RemAssign),
216 "Shl" => Ok(Self::Shl),
217 "ShlAssign" => Ok(Self::ShlAssign),
218 "Shr" => Ok(Self::Shr),
219 "ShrAssign" => Ok(Self::ShrAssign),
220 "Sub" => Ok(Self::Sub),
221 "SubAssign" => Ok(Self::SubAssign),
222 "Termination" => Ok(Self::Termination),
223 "SliceIndex" => Ok(Self::SliceIndex),
224 "FromStr" => Ok(Self::FromStr),
225 "ToString" => Ok(Self::ToString),
226 _ => Err(()),
227 }
228 }
229}
230impl TryFrom<&Ident> for StandardTrait {
231 type Error = ();
232 fn try_from(value: &Ident) -> Result<Self, Self::Error> {
233 StandardTrait::from_str(value.to_string().as_str())
234 }
235}
236
237impl Deref for TraitSchematic {
238 type Target = ItemTrait;
239
240 fn deref(&self) -> &Self::Target {
241 &self.0
242 }
243}