penum/dispatch/standard/
mod.rs

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}