pyo3_stub_gen/generate/
enum_.rs

1use crate::{generate::*, type_info::*};
2use std::fmt;
3
4/// Definition of a Python enum.
5#[derive(Debug, Clone, PartialEq)]
6pub struct EnumDef {
7    pub name: &'static str,
8    pub doc: &'static str,
9    pub variants: &'static [(&'static str, &'static str)],
10    pub methods: Vec<MethodDef>,
11    pub attrs: Vec<MemberDef>,
12    pub getters: Vec<MemberDef>,
13    pub setters: Vec<MemberDef>,
14}
15
16impl From<&PyEnumInfo> for EnumDef {
17    fn from(info: &PyEnumInfo) -> Self {
18        Self {
19            name: info.pyclass_name,
20            doc: info.doc,
21            variants: info.variants,
22            methods: Vec::new(),
23            attrs: Vec::new(),
24            getters: Vec::new(),
25            setters: Vec::new(),
26        }
27    }
28}
29
30impl fmt::Display for EnumDef {
31    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32        writeln!(f, "class {}(Enum):", self.name)?;
33        let indent = indent();
34        docstring::write_docstring(f, self.doc, indent)?;
35        for (variant, variant_doc) in self.variants {
36            writeln!(f, "{indent}{variant} = ...")?;
37            docstring::write_docstring(f, variant_doc, indent)?;
38        }
39        if !(self.attrs.is_empty()
40            && self.getters.is_empty()
41            && self.setters.is_empty()
42            && self.methods.is_empty())
43        {
44            writeln!(f)?;
45            for attr in &self.attrs {
46                attr.fmt(f)?;
47            }
48            for getter in &self.getters {
49                GetterDisplay(getter).fmt(f)?;
50            }
51            for setter in &self.setters {
52                SetterDisplay(setter).fmt(f)?;
53            }
54            for methods in &self.methods {
55                methods.fmt(f)?;
56            }
57        }
58        writeln!(f)?;
59        Ok(())
60    }
61}