codeviz_python/
method_spec.rs

1use 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}