[pdm-devel] [PATCH proxmox 4/4] docgen: add a stop-gap fix to allow generating schema for pve-api-types

Shannon Sterz s.sterz at proxmox.com
Wed Nov 12 11:24:12 CET 2025


Signed-off-by: Shannon Sterz <s.sterz at proxmox.com>
---
 proxmox-docgen/src/lib.rs | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/proxmox-docgen/src/lib.rs b/proxmox-docgen/src/lib.rs
index 67d502d5..f3d53519 100644
--- a/proxmox-docgen/src/lib.rs
+++ b/proxmox-docgen/src/lib.rs
@@ -97,7 +97,7 @@ fn dump_schema(schema: &Schema) -> Value {
             }
         }
         Schema::Object(object_schema) => {
-            data = dump_property_schema(object_schema);
+            data = dump_property_schema(object_schema, false);
             data["type"] = "object".into();
             if let Some(default_key) = object_schema.default_key {
                 data["default_key"] = default_key.into();
@@ -117,7 +117,12 @@ fn dump_schema(schema: &Schema) -> Value {
             }
         }
         Schema::AllOf(alloff_schema) => {
-            data = dump_property_schema(alloff_schema);
+            let dirty_allof = alloff_schema
+                .list
+                .iter()
+                .any(|schema| schema.any_object().is_none());
+
+            data = dump_property_schema(alloff_schema, dirty_allof);
             data["type"] = "object".into();
         }
         Schema::OneOf(schema) => {
@@ -144,7 +149,8 @@ fn dump_schema(schema: &Schema) -> Value {
     data
 }
 
-fn dump_property_schema(param: &dyn ObjectSchemaType) -> Value {
+// TODO: remove `dirty_allof` again once pve-api-types generates proper `AllOf` schema.
+fn dump_property_schema(param: &dyn ObjectSchemaType, dirty_allof: bool) -> Value {
     let mut properties = json!({});
 
     for (prop, optional, schema) in param.properties() {
@@ -155,13 +161,23 @@ fn dump_property_schema(param: &dyn ObjectSchemaType) -> Value {
         properties[prop] = property;
     }
 
-    let data = json!({
-        "description": param.description(),
-        "additionalProperties": param.additional_properties(),
-        "properties": properties,
-    });
-
-    data
+    if dirty_allof {
+        json!({
+            "description": param.description(),
+            // stop gap for now. pve-api-types generates certain properties as string schema that
+            // are really property strings (which wrap an object schema anyway). however,
+            // `additional_properties()` panics there, because it will expect *only* object
+            // schema.
+            "additionalProperties": true,
+            "properties": properties,
+        })
+    } else {
+        json!({
+            "description": param.description(),
+            "additionalProperties": param.additional_properties(),
+            "properties": properties,
+        })
+    }
 }
 
 fn dump_api_permission(permission: &Permission, privileges: &[(&str, u64)]) -> Value {
@@ -222,7 +238,7 @@ fn dump_api_method_schema(
         "description": api_method.parameters.description(),
     });
 
-    data["parameters"] = dump_property_schema(&api_method.parameters);
+    data["parameters"] = dump_property_schema(&api_method.parameters, false);
 
     let mut returns = dump_schema(api_method.returns.schema);
     if api_method.returns.optional {
-- 
2.47.3





More information about the pdm-devel mailing list