sdbus++: parse error info yaml

Change-Id: I73361b6f9b48b32a206d1e6d3e52ff46195b3cbc
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/tools/example/net/poettering/Calculator.errors.yaml b/tools/example/net/poettering/Calculator.errors.yaml
new file mode 100644
index 0000000..730e2a3
--- /dev/null
+++ b/tools/example/net/poettering/Calculator.errors.yaml
@@ -0,0 +1,3 @@
+- name: DivisionByZero
+  description: >
+    An attempt to divide by zero was attempted.
diff --git a/tools/sdbus++ b/tools/sdbus++
index 2e4e330..db96b1f 100755
--- a/tools/sdbus++
+++ b/tools/sdbus++
@@ -9,10 +9,12 @@
 def main():
     module_path = os.path.dirname(sdbusplus.__file__)
 
-    valid_types = {'interface': sdbusplus.Interface}
+    valid_types = {'interface': sdbusplus.Interface,
+                   'error': sdbusplus.Error}
     valid_processes = {'markdown': "markdown",
                        'server-header': "server_header",
-                       'server-cpp': "server_cpp"}
+                       'server-cpp': "server_cpp",
+                       'exception-header': "exception_header"}
 
     parser = argparse.ArgumentParser(description='Process sdbus++ YAML files.')
 
diff --git a/tools/sdbusplus/__init__.py b/tools/sdbusplus/__init__.py
index 2ab249b..4703f22 100644
--- a/tools/sdbusplus/__init__.py
+++ b/tools/sdbusplus/__init__.py
@@ -1 +1,2 @@
 from sdbusplus.interface import Interface
+from sdbusplus.error import Error
diff --git a/tools/sdbusplus/error.py b/tools/sdbusplus/error.py
new file mode 100644
index 0000000..ff3926c
--- /dev/null
+++ b/tools/sdbusplus/error.py
@@ -0,0 +1,27 @@
+import os
+import yaml
+from .namedelement import NamedElement
+from .renderer import Renderer
+
+
+class Error(NamedElement, Renderer):
+    @staticmethod
+    def load(name, rootdir='.'):
+        filename = os.path.join(rootdir,
+                                name.replace('.', '/') + ".errors.yaml")
+
+        with open(filename) as f:
+            data = f.read()
+            y = yaml.safe_load(data)
+            y = {'name': name,
+                 'errors': y}
+            return Error(**y)
+
+    def __init__(self, **kwargs):
+        self.errors = \
+            [NamedElement(**n) for n in kwargs.pop('errors', [])]
+
+        super(Error, self).__init__(**kwargs)
+
+    def exception_header(self, loader):
+        return ""