1use pyo3::{
2 pyclass, pyfunction, pymodule,
3 types::{PyModule, PyModuleMethods},
4 wrap_pyfunction, Bound, PyResult,
5};
6
7#[pymodule(gil_used = false)]
8pub fn enums(m: &Bound<'_, PyModule>) -> PyResult<()> {
9 m.add_class::<SimpleEnum>()?;
10 m.add_class::<ComplexEnum>()?;
11 m.add_class::<SimpleTupleEnum>()?;
12 m.add_class::<TupleEnum>()?;
13 m.add_class::<MixedComplexEnum>()?;
14 m.add_wrapped(wrap_pyfunction!(do_simple_stuff))?;
15 m.add_wrapped(wrap_pyfunction!(do_complex_stuff))?;
16 m.add_wrapped(wrap_pyfunction!(do_tuple_stuff))?;
17 m.add_wrapped(wrap_pyfunction!(do_mixed_complex_stuff))?;
18 Ok(())
19}
20
21#[pyclass(eq, eq_int)]
22#[derive(PartialEq)]
23pub enum SimpleEnum {
24 Sunday,
25 Monday,
26 Tuesday,
27 Wednesday,
28 Thursday,
29 Friday,
30 Saturday,
31}
32
33#[pyfunction]
34pub fn do_simple_stuff(thing: &SimpleEnum) -> SimpleEnum {
35 match thing {
36 SimpleEnum::Sunday => SimpleEnum::Monday,
37 SimpleEnum::Monday => SimpleEnum::Tuesday,
38 SimpleEnum::Tuesday => SimpleEnum::Wednesday,
39 SimpleEnum::Wednesday => SimpleEnum::Thursday,
40 SimpleEnum::Thursday => SimpleEnum::Friday,
41 SimpleEnum::Friday => SimpleEnum::Saturday,
42 SimpleEnum::Saturday => SimpleEnum::Sunday,
43 }
44}
45
46#[pyclass]
47pub enum ComplexEnum {
48 Int {
49 i: i32,
50 },
51 Float {
52 f: f64,
53 },
54 Str {
55 s: String,
56 },
57 EmptyStruct {},
58 MultiFieldStruct {
59 a: i32,
60 b: f64,
61 c: bool,
62 },
63 #[pyo3(constructor = (a = 42, b = None))]
64 VariantWithDefault {
65 a: i32,
66 b: Option<String>,
67 },
68}
69
70#[pyfunction]
71pub fn do_complex_stuff(thing: &ComplexEnum) -> ComplexEnum {
72 match thing {
73 ComplexEnum::Int { i } => ComplexEnum::Str { s: i.to_string() },
74 ComplexEnum::Float { f } => ComplexEnum::Float { f: f * f },
75 ComplexEnum::Str { s } => ComplexEnum::Int { i: s.len() as i32 },
76 ComplexEnum::EmptyStruct {} => ComplexEnum::EmptyStruct {},
77 ComplexEnum::MultiFieldStruct { a, b, c } => ComplexEnum::MultiFieldStruct {
78 a: *a,
79 b: *b,
80 c: *c,
81 },
82 ComplexEnum::VariantWithDefault { a, b } => ComplexEnum::VariantWithDefault {
83 a: 2 * a,
84 b: b.as_ref().map(|s| s.to_uppercase()),
85 },
86 }
87}
88
89#[pyclass]
90enum SimpleTupleEnum {
91 Int(i32),
92 Str(String),
93}
94
95#[pyclass]
96pub enum TupleEnum {
97 #[pyo3(constructor = (_0 = 1, _1 = 1.0, _2 = true))]
98 FullWithDefault(i32, f64, bool),
99 Full(i32, f64, bool),
100 EmptyTuple(),
101}
102
103#[pyfunction]
104pub fn do_tuple_stuff(thing: &TupleEnum) -> TupleEnum {
105 match thing {
106 TupleEnum::FullWithDefault(a, b, c) => TupleEnum::FullWithDefault(*a, *b, *c),
107 TupleEnum::Full(a, b, c) => TupleEnum::Full(*a, *b, *c),
108 TupleEnum::EmptyTuple() => TupleEnum::EmptyTuple(),
109 }
110}
111
112#[pyclass]
113pub enum MixedComplexEnum {
114 Nothing {},
115 Empty(),
116}
117
118#[pyfunction]
119pub fn do_mixed_complex_stuff(thing: &MixedComplexEnum) -> MixedComplexEnum {
120 match thing {
121 MixedComplexEnum::Nothing {} => MixedComplexEnum::Empty(),
122 MixedComplexEnum::Empty() => MixedComplexEnum::Nothing {},
123 }
124}