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