pyo3_stub_gen/generate/
variant_methods.rs1use indexmap::IndexMap;
2
3use crate::generate::{MethodDef, MethodType, Parameter, ParameterDefault, Parameters};
4use crate::type_info::{ParameterKind, PyComplexEnumInfo, VariantForm, VariantInfo};
5use crate::TypeInfo;
6use std::collections::{HashMap, HashSet};
7
8pub(super) fn get_variant_methods(
9 enum_info: &PyComplexEnumInfo,
10 info: &VariantInfo,
11) -> IndexMap<String, Vec<MethodDef>> {
12 let full_class_name = format!("{}.{}", enum_info.pyclass_name, info.pyclass_name);
13
14 let mut methods: IndexMap<String, Vec<MethodDef>> = IndexMap::new();
15
16 methods
17 .entry("__new__".to_string())
18 .or_default()
19 .push(MethodDef {
20 name: "__new__",
21 parameters: Parameters::from_infos(info.constr_args),
22 r#return: TypeInfo {
23 name: full_class_name,
24 source_module: None,
25 import: HashSet::new(),
26 type_refs: HashMap::new(),
27 },
28 doc: "",
29 r#type: MethodType::New,
30 is_async: false,
31 deprecated: None,
32 type_ignored: None,
33 is_overload: false,
34 });
35
36 if let VariantForm::Tuple = info.form {
37 let len_name = "__len__";
38 methods
39 .entry(len_name.to_string())
40 .or_default()
41 .push(MethodDef {
42 name: len_name,
43 parameters: Parameters::new(),
44 r#return: TypeInfo::builtin("int"),
45 doc: "",
46 r#type: MethodType::Instance,
47 is_async: false,
48 deprecated: None,
49 type_ignored: None,
50 is_overload: false,
51 });
52
53 let getitem_name = "__getitem__";
54 methods
55 .entry(getitem_name.to_string())
56 .or_default()
57 .push(MethodDef {
58 name: getitem_name,
59 parameters: Parameters {
60 positional_or_keyword: vec![Parameter {
61 name: "key",
62 kind: ParameterKind::PositionalOrKeyword,
63 type_info: TypeInfo::builtin("int"),
64 default: ParameterDefault::None,
65 }],
66 ..Parameters::new()
67 },
68 r#return: TypeInfo::any(),
69 doc: "",
70 r#type: MethodType::Instance,
71 is_async: false,
72 deprecated: None,
73 type_ignored: None,
74 is_overload: false,
75 });
76 }
77
78 methods
79}