From: Peter Krempa <[email protected]>

Create 'virTypedParamValidateType' which will use the same logic
encapsulated in a function. Use the error message wording from
'virTypedParamsValidate' as it contains less fluff.

Signed-off-by: Peter Krempa <[email protected]>
---
 src/util/virtypedparam-public.c | 54 +++++++++++++++++++++------------
 src/util/virtypedparam.c        | 27 +++++++++++++++++
 src/util/virtypedparam.h        |  4 +++
 3 files changed, 66 insertions(+), 19 deletions(-)

diff --git a/src/util/virtypedparam-public.c b/src/util/virtypedparam-public.c
index 3486623a9c..8a953ed20f 100644
--- a/src/util/virtypedparam-public.c
+++ b/src/util/virtypedparam-public.c
@@ -147,18 +147,6 @@ virTypedParamsGet(virTypedParameterPtr params,
 }


-#define VIR_TYPED_PARAM_CHECK_TYPE(check_type) \
-    do { if (param->type != check_type) { \
-        virReportError(VIR_ERR_INVALID_ARG, \
-                       _("Invalid type '%1$s' requested for parameter '%2$s', 
actual type is '%3$s'"), \
-                       virTypedParameterTypeToString(check_type), \
-                       name, \
-                       virTypedParameterTypeToString(param->type)); \
-        virDispatchError(NULL); \
-        return -1; \
-    } } while (0)
-
-
 /**
  * virTypedParamsGetInt:
  * @params: array of typed parameters
@@ -189,7 +177,11 @@ virTypedParamsGetInt(virTypedParameterPtr params,
     if (!(param = virTypedParamsGet(params, nparams, name)))
         return 0;

-    VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_INT);
+    if (virTypedParamValidateType(param, VIR_TYPED_PARAM_INT) < 0) {
+        virDispatchError(NULL);
+        return -1;
+    }
+
     if (value)
         *value = param->value.i;

@@ -227,7 +219,11 @@ virTypedParamsGetUInt(virTypedParameterPtr params,
     if (!(param = virTypedParamsGet(params, nparams, name)))
         return 0;

-    VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_UINT);
+    if (virTypedParamValidateType(param, VIR_TYPED_PARAM_UINT) < 0) {
+        virDispatchError(NULL);
+        return -1;
+    }
+
     if (value)
         *value = param->value.ui;

@@ -265,7 +261,11 @@ virTypedParamsGetLLong(virTypedParameterPtr params,
     if (!(param = virTypedParamsGet(params, nparams, name)))
         return 0;

-    VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_LLONG);
+    if (virTypedParamValidateType(param, VIR_TYPED_PARAM_LLONG) < 0) {
+        virDispatchError(NULL);
+        return -1;
+    }
+
     if (value)
         *value = param->value.l;

@@ -303,7 +303,11 @@ virTypedParamsGetULLong(virTypedParameterPtr params,
     if (!(param = virTypedParamsGet(params, nparams, name)))
         return 0;

-    VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_ULLONG);
+    if (virTypedParamValidateType(param, VIR_TYPED_PARAM_ULLONG) < 0) {
+        virDispatchError(NULL);
+        return -1;
+    }
+
     if (value)
         *value = param->value.ul;

@@ -341,7 +345,11 @@ virTypedParamsGetDouble(virTypedParameterPtr params,
     if (!(param = virTypedParamsGet(params, nparams, name)))
         return 0;

-    VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_DOUBLE);
+    if (virTypedParamValidateType(param, VIR_TYPED_PARAM_DOUBLE) < 0) {
+        virDispatchError(NULL);
+        return -1;
+    }
+
     if (value)
         *value = param->value.d;

@@ -379,7 +387,11 @@ virTypedParamsGetBoolean(virTypedParameterPtr params,
     if (!(param = virTypedParamsGet(params, nparams, name)))
         return 0;

-    VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_BOOLEAN);
+    if (virTypedParamValidateType(param, VIR_TYPED_PARAM_BOOLEAN) < 0) {
+        virDispatchError(NULL);
+        return -1;
+    }
+
     if (value)
         *value = !!param->value.b;

@@ -419,7 +431,11 @@ virTypedParamsGetString(virTypedParameterPtr params,
     if (!(param = virTypedParamsGet(params, nparams, name)))
         return 0;

-    VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_STRING);
+    if (virTypedParamValidateType(param, VIR_TYPED_PARAM_STRING) < 0) {
+        virDispatchError(NULL);
+        return -1;
+    }
+
     if (value)
         *value = param->value.s;

diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c
index f25530a735..0b40c14f90 100644
--- a/src/util/virtypedparam.c
+++ b/src/util/virtypedparam.c
@@ -42,6 +42,33 @@ VIR_ENUM_IMPL(virTypedParameter,
               "string",
 );

+
+/**
+ * virTypedParamValidateType:
+ * @param: typed parameter to validate
+ * @expected_type: type to look for
+ *
+ * Validates that @param is a parameter of @expected type.
+ *
+ * Returns 0 on success; -1 on error and reports an error.
+ */
+int
+virTypedParamValidateType(virTypedParameterPtr param,
+                          unsigned int expected_type)
+{
+    if (param->type != expected_type) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("invalid type '%1$s' for parameter '%2$s', expected 
'%3$s'"),
+                       virTypedParameterTypeToString(expected_type),
+                       param->field,
+                       virTypedParameterTypeToString(param->type));
+        return -1;
+    }
+
+    return 0;
+}
+
+
 static int
 virTypedParamsSortName(const void *left,
                        const void *right,
diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h
index 774744244a..c1fc28c612 100644
--- a/src/util/virtypedparam.h
+++ b/src/util/virtypedparam.h
@@ -63,6 +63,10 @@ struct _virTypedParameterRemote {
     virTypedParameterRemoteValue value;
 };

+int
+virTypedParamValidateType(virTypedParameterPtr param,
+                          unsigned int expected_type)
+    G_GNUC_WARN_UNUSED_RESULT;

 int
 virTypedParamsValidate(virTypedParameterPtr params,
-- 
2.54.0

Reply via email to