Rewrite pimgen in the image of sdbus++

Almost complete rewrite of pimgen and the mako template.

Adopt the sdbus++ application structure.  The hope is that
this will encourage additional sdbusplus features deemed
general purpose enough for reuse with other applications.

Change-Id: I007ff9f5fc9a64f0465159bd1301475ada139d55
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/generated.mako.cpp b/generated.mako.cpp
index 8534674..a024d19 100644
--- a/generated.mako.cpp
+++ b/generated.mako.cpp
@@ -1,16 +1,10 @@
 ## This file is a template.  The comment below is emitted
 ## into the rendered file; feel free to edit this file.
 // This file was auto generated.  Do not edit.
-<%
-    def interface_type(interface):
-        lst = interface.split('.')
-        lst.insert(-1, 'server')
-        return '::'.join(lst)
-%>
 #include "manager.hpp"
 #include "utils.hpp"
 % for i in interfaces:
-#include <${'/'.join(i.split('.') + ['server.hpp'])}>
+#include <${i.header()}>
 % endfor
 
 namespace phosphor
@@ -23,10 +17,10 @@
 const Manager::Makers Manager::_makers{
 % for i in interfaces:
     {
-        "${i}",
+        "${str(i)}",
         details::MakeInterface<
             details::ServerObject<
-                sdbusplus::${interface_type(i)}>>::make,
+                ${i.namespace()}>>::make,
     },
 % endfor
 };
@@ -34,47 +28,71 @@
 const Manager::Events Manager::_events{
 % for e in events:
     {
-    % if e.get('description'):
-        // ${e['description']}
+    % if e.description:
+        // ${e.description.strip()}
     % endif
         std::make_tuple(
-            std::vector<details::EventBasePtr>({
-                std::make_shared<details::DbusSignal>(
-        % for i, s in enumerate(e['signature'].items()):
-            % if i + 1 == len(e['signature']):
-            ${'"{0}=\'{1}\'"'.format(*s)},
+            std::vector<details::EventBasePtr>(
+                {
+    % if e.cls == 'match':
+                    std::make_shared<details::DbusSignal>(
+        % for i, s in enumerate(e.signatures[0].sig.items()):
+            % if i == 0:
+                        ${'"{0}=\'{1}\',"'.format(*s)}
+            % elif i + 1 == len(e.signatures[0].sig):
+                            ${'"{0}=\'{1}\'"'.format(*s)},
             % else:
-            ${'"{0}=\'{1}\',"'.format(*s)}
+                            ${'"{0}=\'{1}\',"'.format(*s)}
             % endif
         % endfor
-            % if e['filter'].get('args'):
-                details::make_filter(filters::${e['filter']['type']}(
-                % for i, a in enumerate(e['filter']['args']):
-                    % if i + 1 == len(e['filter']['args']):
-                "${a['value']}")))}),
+        % if e.filters[0].pointer:
+                        details::make_filter(${e.filters[0].bare_method()})),
+        % else:
+            % if e.filters[0].args:
+                        details::make_filter(
+                            ${e.filters[0].bare_method()}(
+                % for i, arg in enumerate(e.filters[0].args):
+                    % if i + 1 != len(e.filters[0].args):
+                                ${arg.cppArg()},
                     % else:
-                "${a['value']}",
+                                ${arg.cppArg()}))),
                     % endif
                 % endfor
             % else:
-                details::make_filter(filters::${e['filter']['type']}))}),
+                        details::make_filter(
+                            ${e.filters[0].bare_method()}()),
             % endif
-            % if e['action'].get('args'):
-            std::vector<details::ActionBasePtr>({details::make_action(actions::${e['action']['type']}(
-                % for i, a in enumerate(e['action']['args']):
-                    % if i + 1 == len(e['action']['args']):
-                "${a['value']}"))})
-                    % else:
-                "${a['value']}",
-                    % endif
-                % endfor
-            % else:
+        % endif
+    % endif
+                }
+            ),
             std::vector<details::ActionBasePtr>(
-                            {details::make_action(actions::${e['action']['type']})})
+                {
+    % for action in e.actions:
+        % if action.pointer:
+                    details::make_action(${action.bare_method()}),
+        % else:
+            % if action.args:
+                    details::make_action(
+                        ${action.bare_method()}(
+                % for i, arg in enumerate(action.args):
+                    % if i + 1 != len(action.args):
+                            ${arg.cppArg()},
+                    % else:
+                            ${arg.cppArg()})),
+                    % endif
+                % endfor
+            % else:
+                        details::make_action(
+                            ${action.bare_method()}()),
             % endif
-        ),
+        % endif
+    % endfor
+                }
+            )
+        )
     },
-% endfor
+%endfor
 };
 
 } // namespace manager