xref: /openbmc/sdbusplus/tools/sdbusplus/method.py (revision 9bf2b23f)
1from .namedelement import NamedElement
2from .property import Property
3from .renderer import Renderer
4
5
6class Method(NamedElement, Renderer):
7    def __init__(self, **kwargs):
8        self.parameters = [Property(**p) for p in kwargs.pop("parameters", [])]
9        self.returns = [Property(**r) for r in kwargs.pop("returns", [])]
10        self.flags = kwargs.pop("flags", [])
11        self.cpp_flags = self.or_cpp_flags(self.flags)
12        self.errors = kwargs.pop("errors", [])
13
14        super(Method, self).__init__(**kwargs)
15
16    def markdown(self, loader):
17        return self.render(loader, "method.md.mako", method=self)
18
19    def cpp_prototype(self, loader, interface, ptype):
20        return self.render(
21            loader,
22            "method.prototype.hpp.mako",
23            method=self,
24            interface=interface,
25            ptype=ptype,
26            post=str.rstrip,
27        )
28
29    def cpp_includes(self, interface):
30        return interface.error_includes(self.errors) + interface.enum_includes(
31            self.returns + self.parameters
32        )
33
34    def returns_as_list(self, interface, full=False):
35        return ", ".join(
36            [r.cppTypeParam(interface.name, full=full) for r in self.returns]
37        )
38
39    def cpp_return_type(self, interface):
40        if len(self.returns) == 0:
41            return "void"
42        elif len(self.returns) == 1:
43            return self.returns[0].cppTypeParam(interface.name)
44        else:
45            return "std::tuple<" + self.returns_as_list(interface) + ">"
46
47    def parameter(self, interface, p, defaultValue=False, ref=""):
48        r = "%s%s %s" % (p.cppTypeParam(interface.name), ref, p.camelCase)
49        if defaultValue:
50            r += p.default_value()
51        return r
52
53    def parameters_as_list(
54        self, transform=lambda p: p.camelCase, join_str=", "
55    ):
56        return join_str.join([transform(p) for p in self.parameters])
57
58    def parameters_as_arg_list(self, interface):
59        return self.parameters_as_list(
60            lambda p: self.parameter(interface, p, ref="&&")
61        )
62
63    def parameter_types_as_list(self, interface):
64        return self.parameters_as_list(
65            lambda p: p.cppTypeParam(interface.name, full=True)
66        )
67
68    def get_parameters_str(
69        self, interface, defaultValue=False, join_str=",\n            "
70    ):
71        return self.parameters_as_list(
72            lambda p: self.parameter(interface, p, defaultValue),
73            join_str,
74        )
75
76    def or_cpp_flags(self, flags):
77        """Return the corresponding ORed cpp flags."""
78        flags_dict = {
79            "deprecated": "vtable::common_::deprecated",
80            "hidden": "vtable::common_::hidden",
81            "unprivileged": "vtable::common_::unprivileged",
82            "no_reply": "vtable::method_::no_reply",
83        }
84
85        cpp_flags = []
86        for flag in flags:
87            try:
88                cpp_flags.append(flags_dict[flag])
89            except KeyError:
90                raise ValueError('Invalid flag "{}"'.format(flag))
91
92        return " | ".join(cpp_flags)
93