facet_reflect/partial/partial_api/
eenum.rs1use super::*;
2
3impl<'facet, const BORROW: bool> Partial<'facet, BORROW> {
7 pub fn selected_variant(&self) -> Option<Variant> {
9 let frame = self.frames().last()?;
10
11 match &frame.tracker {
12 Tracker::Enum { variant, .. } => Some(**variant),
13 _ => None,
14 }
15 }
16
17 pub fn find_variant(&self, variant_name: &str) -> Option<(usize, &'static Variant)> {
19 let frame = self.frames().last()?;
20
21 if let Type::User(UserType::Enum(enum_def)) = frame.shape.ty {
22 enum_def
23 .variants
24 .iter()
25 .enumerate()
26 .find(|(_, v)| v.name == variant_name)
27 } else {
28 None
29 }
30 }
31
32 pub fn select_nth_variant(mut self, index: usize) -> Result<Self, ReflectError> {
48 let frame = self.frames().last().unwrap();
49 let enum_type = frame.get_enum_type()?;
50
51 if index >= enum_type.variants.len() {
52 return Err(ReflectError::OperationFailed {
53 shape: frame.shape,
54 operation: "variant index out of bounds",
55 });
56 }
57 let variant = &enum_type.variants[index];
58
59 self.select_variant_internal(&enum_type, variant)?;
60 Ok(self)
61 }
62
63 pub fn select_variant_named(mut self, variant_name: &str) -> Result<Self, ReflectError> {
67 let frame = self.frames_mut().last_mut().unwrap();
68 let enum_type = frame.get_enum_type()?;
69
70 let Some(variant) = enum_type.variants.iter().find(|v| v.name == variant_name) else {
71 return Err(ReflectError::OperationFailed {
72 shape: frame.shape,
73 operation: "No variant found with the given name",
74 });
75 };
76
77 self.select_variant_internal(&enum_type, variant)?;
78 Ok(self)
79 }
80
81 pub fn select_variant(mut self, discriminant: i64) -> Result<Self, ReflectError> {
86 let frame = self.frames().last().unwrap();
88
89 let enum_type = match frame.shape.ty {
91 Type::User(UserType::Enum(e)) => e,
92 _ => {
93 return Err(ReflectError::WasNotA {
94 expected: "enum",
95 actual: frame.shape,
96 });
97 }
98 };
99
100 let Some(variant) = enum_type
102 .variants
103 .iter()
104 .find(|v| v.discriminant == Some(discriminant))
105 else {
106 return Err(ReflectError::OperationFailed {
107 shape: frame.shape,
108 operation: "No variant found with the given discriminant",
109 });
110 };
111
112 self.select_variant_internal(&enum_type, variant)?;
114
115 Ok(self)
116 }
117}