[libvirt] [PATCH RFC 1/2] util: Add VIR_ENUM_IMPL_LABEL

Cole Robinson crobinso at redhat.com
Thu Jul 26 17:49:54 UTC 2018


This allows passing in a string label describing the enum, which can
be used to autogenerate error messages

Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/util/virutil.c | 20 ++++++++++++++++----
 src/util/virutil.h | 15 ++++++++++-----
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/src/util/virutil.c b/src/util/virutil.c
index a908422feb..6d23a26a74 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -444,16 +444,22 @@ virParseVersionString(const char *str, unsigned long *version,
 
 int virEnumFromString(const char *const*types,
                       unsigned int ntypes,
-                      const char *type)
+                      const char *type,
+                      const char * const label)
 {
     size_t i;
     if (!type)
-        return -1;
+        goto error;
 
     for (i = 0; i < ntypes; i++)
         if (STREQ(types[i], type))
             return i;
 
+ error:
+    if (label) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("Unknown '%s' value '%s'"), label, type);
+    }
     return -1;
 }
 
@@ -540,10 +546,16 @@ virFormatIntPretty(unsigned long long val,
 
 const char *virEnumToString(const char *const*types,
                             unsigned int ntypes,
-                            int type)
+                            int type,
+                            const char * const label)
 {
-    if (type < 0 || type >= ntypes)
+    if (type < 0 || type >= ntypes) {
+        if (label) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Unknown '%s' internal value %d"), label, type);
+        }
         return NULL;
+    }
 
     return types[type];
 }
diff --git a/src/util/virutil.h b/src/util/virutil.h
index 1ba9635bd9..345c9e053d 100644
--- a/src/util/virutil.h
+++ b/src/util/virutil.h
@@ -76,26 +76,31 @@ char *virIndexToDiskName(int idx, const char *prefix);
 
 int virEnumFromString(const char *const*types,
                       unsigned int ntypes,
-                      const char *type);
+                      const char *type,
+                      const char *errmsg);
 
 const char *virEnumToString(const char *const*types,
                             unsigned int ntypes,
-                            int type);
+                            int type,
+                            const char *errmsg);
 
-# define VIR_ENUM_IMPL(name, lastVal, ...) \
+# define VIR_ENUM_IMPL_LABEL(name, label, lastVal, ...) \
     static const char *const name ## TypeList[] = { __VA_ARGS__ }; \
     verify(ARRAY_CARDINALITY(name ## TypeList) == lastVal); \
     const char *name ## TypeToString(int type) { \
         return virEnumToString(name ## TypeList, \
                                ARRAY_CARDINALITY(name ## TypeList), \
-                               type); \
+                               type, label); \
     } \
     int name ## TypeFromString(const char *type) { \
         return virEnumFromString(name ## TypeList, \
                                  ARRAY_CARDINALITY(name ## TypeList), \
-                                 type); \
+                                 type, label); \
     }
 
+# define VIR_ENUM_IMPL(name, lastVal, ...) \
+    VIR_ENUM_IMPL_LABEL(name, NULL, lastVal, __VA_ARGS__)
+
 # define VIR_ENUM_DECL(name) \
     const char *name ## TypeToString(int type); \
     int name ## TypeFromString(const char*type);
-- 
2.17.1




More information about the libvir-list mailing list