[Bf-blender-cvs] [07feb6e8144] master: PyC API: utility to parse a string as an RNA like enum

Campbell Barton noreply at git.blender.org
Mon Sep 30 21:22:18 CEST 2019


Commit: 07feb6e81441b084775e7cb7a042fc19c8c126d4
Author: Campbell Barton
Date:   Tue Oct 1 04:09:33 2019 +1000
Branches: master
https://developer.blender.org/rB07feb6e81441b084775e7cb7a042fc19c8c126d4

PyC API: utility to parse a string as an RNA like enum

More convenient than comparing strings,
with the advantage that errors don't need to repeat expected values.

===================================================================

M	source/blender/python/generic/py_capi_utils.c
M	source/blender/python/generic/py_capi_utils.h

===================================================================

diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index ca9f15ed01a..a6983c38f0e 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -231,6 +231,37 @@ int PyC_ParseBool(PyObject *o, void *p)
   return 1;
 }
 
+/**
+ * Use with PyArg_ParseTuple's "O&" formatting.
+ */
+int PyC_ParseStringEnum(PyObject *o, void *p)
+{
+  struct PyC_StringEnum *e = p;
+  const char *value = _PyUnicode_AsString(o);
+  if (value == NULL) {
+    PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name);
+    return 0;
+  }
+  int i;
+  for (i = 0; e->items[i].id; i++) {
+    if (STREQ(e->items[i].id, value)) {
+      e->value_found = e->items[i].value;
+      return 1;
+    }
+  }
+
+  /* Set as a precaution. */
+  e->value_found = -1;
+
+  PyObject *enum_items = PyTuple_New(i);
+  for (i = 0; e->items[i].id; i++) {
+    PyTuple_SET_ITEM(enum_items, i, PyUnicode_FromString(e->items[i].id));
+  }
+  PyErr_Format(PyExc_ValueError, "expected a string in %S, got '%s'", enum_items, value);
+  Py_DECREF(enum_items);
+  return 0;
+}
+
 /* silly function, we dont use arg. just check its compatible with __deepcopy__ */
 int PyC_CheckArgs_DeepCopy(PyObject *args)
 {
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index 4454aa11d77..1f552c3d78d 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -126,6 +126,17 @@ bool PyC_RunString_AsString(const char **imports,
 
 int PyC_ParseBool(PyObject *o, void *p);
 
+struct PyC_StringEnumItems {
+  int value;
+  const char *id;
+};
+struct PyC_StringEnum {
+  const struct PyC_StringEnumItems *items;
+  int value_found;
+};
+
+int PyC_ParseStringEnum(PyObject *o, void *p);
+
 int PyC_CheckArgs_DeepCopy(PyObject *args);
 
 /* Integer parsing (with overflow checks), -1 on error. */



More information about the Bf-blender-cvs mailing list