codeviz_python/
method_spec.rs1use super::*;
2
3#[derive(Debug, Clone)]
4pub struct MethodSpec {
5 pub name: String,
6 pub decorators: Vec<DecoratorSpec>,
7 pub arguments: Vec<Statement>,
8 pub elements: Elements,
9}
10
11impl MethodSpec {
12 pub fn new(name: &str) -> MethodSpec {
13 MethodSpec {
14 name: name.to_owned(),
15 decorators: Vec::new(),
16 arguments: Vec::new(),
17 elements: Elements::new(),
18 }
19 }
20
21 pub fn push_decorator<D>(&mut self, decorator: D)
22 where
23 D: Into<DecoratorSpec>,
24 {
25 self.decorators.push(decorator.into());
26 }
27
28 pub fn push_argument<S>(&mut self, argument: S)
29 where
30 S: Into<Statement>,
31 {
32 self.arguments.push(argument.into());
33 }
34
35 pub fn push<E>(&mut self, element: E)
36 where
37 E: Into<Element>,
38 {
39 self.elements.push(element);
40 }
41}
42
43impl From<MethodSpec> for Element {
44 fn from(value: MethodSpec) -> Element {
45 let mut out: Vec<Element> = Vec::new();
46
47 for decorator in value.decorators {
48 out.push(decorator.into());
49 }
50
51 let mut decl = Statement::new();
52 decl.push("def ");
53 decl.push(value.name);
54 decl.push("(");
55
56 let mut arguments = Statement::new();
57
58 for argument in value.arguments {
59 arguments.push(argument);
60 }
61
62 decl.push(arguments.join(", "));
63 decl.push("):");
64
65 out.push(decl.into());
66
67 if value.elements.is_empty() {
68 out.push(Nested(Box::new("pass".into())));
69 } else {
70 out.push(Nested(Box::new(value.elements.into())));
71 }
72
73 Inner(out)
74 }
75}