blob: e9c6f29c7ef2126c547cb13ceb8a1fd3a9184f86 [file] [log] [blame]
David Tolnay4c6052d2020-12-31 15:01:04 -08001use crate::syntax::Type;
2use proc_macro2::Ident;
3
David Tolnaye352c1e2020-12-31 16:41:05 -08004#[derive(Copy, Clone, PartialEq, Eq, Hash)]
David Tolnay4c6052d2020-12-31 15:01:04 -08005pub enum ImplKey<'a> {
6 RustBox(&'a Ident),
7 RustVec(&'a Ident),
8 UniquePtr(&'a Ident),
9 SharedPtr(&'a Ident),
10 WeakPtr(&'a Ident),
11 CxxVector(&'a Ident),
12}
13
14impl Type {
15 pub(crate) fn impl_key(&self) -> Option<ImplKey> {
16 if let Type::RustBox(ty) = self {
17 if let Type::Ident(ident) = &ty.inner {
18 return Some(ImplKey::RustBox(&ident.rust));
19 }
20 } else if let Type::RustVec(ty) = self {
21 if let Type::Ident(ident) = &ty.inner {
22 return Some(ImplKey::RustVec(&ident.rust));
23 }
24 } else if let Type::UniquePtr(ty) = self {
25 if let Type::Ident(ident) = &ty.inner {
26 return Some(ImplKey::UniquePtr(&ident.rust));
27 }
28 } else if let Type::SharedPtr(ty) = self {
29 if let Type::Ident(ident) = &ty.inner {
30 return Some(ImplKey::SharedPtr(&ident.rust));
31 }
32 } else if let Type::WeakPtr(ty) = self {
33 if let Type::Ident(ident) = &ty.inner {
34 return Some(ImplKey::WeakPtr(&ident.rust));
35 }
36 } else if let Type::CxxVector(ty) = self {
37 if let Type::Ident(ident) = &ty.inner {
38 return Some(ImplKey::CxxVector(&ident.rust));
39 }
40 }
41 None
42 }
43}