changeset 188:d6d4afc03622

Minor fixes to enums generated code
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 29 Jan 2021 11:44:58 +0100
parents 9057a045fd41
children a7168ed85cc4
files generate/generate.py generate/templates.py
diffstat 2 files changed, 30 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/generate/generate.py	Fri Jan 29 11:44:28 2021 +0100
+++ b/generate/generate.py	Fri Jan 29 11:44:58 2021 +0100
@@ -34,16 +34,17 @@
     return name[0].upper() + name[1:]
 
 
+def sanitize_id(s):
+    return s.replace('$', 'dollar').replace('#', 'hash').replace('.', '_')
+
+
 def rust_identifier(name):
-    def sanitize(s):
-        return s.replace('$', 'dollar').replace('#', 'hash').replace('.', '_')
-
     def r(c):
         if not c.isupper():
             return c
         return '_' + c.lower()
 
-    return ''.join([(r(c) if i > 0 else c.lower()) for i, c in enumerate(sanitize(name))])
+    return ''.join([(r(c) if i > 0 else c.lower()) for i, c in enumerate(sanitize_id(name))])
 
 
 def snake_to_camel(name):
@@ -175,19 +176,20 @@
                     return build('DateTime', typ='DateTime<Utc>')
 
             if 'enum' in schema and name:
-                name_ = snake_to_camel(rust_identifier(name))
+                name_ = (sanitize_id(name))
                 def sanitize_enum_value(v):
                     if v[0].isnumeric():
                         return '_'+v
-                    return snake_to_camel(v)
+                    return v[0].upper() + v[1:]
 
                 values = [{
                     'line': sanitize_enum_value(ev),
+                    'jsonvalue': ev,
                     'desc': schema.get('enumDescriptions', ['']*(i))[i]}
                     for (i, ev) in enumerate(schema.get('enum', []))]
                 templ_params = {'name': name_, 'values': values}
                 print('Emitted enum', name_, 'with', len(values), 'fields')
-                return (name_, schema.get('description', '')), structs, [templ_params]
+                return (optionalize(name_, optional), schema.get('description', '')), structs, [templ_params]
 
             return (optionalize('String', optional), schema.get('description', '')), structs, enums
 
--- a/generate/templates.py	Fri Jan 29 11:44:28 2021 +0100
+++ b/generate/templates.py	Fri Jan 29 11:44:58 2021 +0100
@@ -49,13 +49,33 @@
 #
 # fields: {name, values: [{desc, line}]}
 SchemaEnumTmpl = '''
-#[derive(Debug, Clone, Copy)]
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum {{{name}}} {
+    Undefined,
     {{#values}}
     /// {{{desc}}}
+    #[serde(rename = "{{{jsonvalue}}}")]
     {{{line}}},
     {{/values}}
 }
+
+impl std::default::Default for {{{name}}} {
+    fn default() -> {{{name}}} {
+        {{{name}}}::Undefined
+    }
+}
+
+impl std::fmt::Display for {{{name}}} {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            {{{name}}}::Undefined => write!(f, "undefined"),
+            {{#values}}
+            {{{name}}}::{{{line}}} => write!(f, "{{{jsonvalue}}}"),
+            {{/values}}
+        };
+        Ok(())
+    }
+}
 '''
 
 # A struct for parameters or input/output API types.