[pdm-devel] [PATCH proxmox-api-types 2/2] generator: derive default for enums that provide a default

Dominik Csapak d.csapak at proxmox.com
Fri Apr 18 11:32:54 CEST 2025


and mark the correct variant as such.

This will be useful if we want to derive `Default` for structs than
contain enums.

while at it, regenerate the bindings.

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 pve-api-types/generator-lib/Schema2Rust.pm |  2 +
 pve-api-types/src/generated/types.rs       | 45 ++++++++++++++--------
 2 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/pve-api-types/generator-lib/Schema2Rust.pm b/pve-api-types/generator-lib/Schema2Rust.pm
index b974454..5235c55 100644
--- a/pve-api-types/generator-lib/Schema2Rust.pm
+++ b/pve-api-types/generator-lib/Schema2Rust.pm
@@ -278,6 +278,7 @@ sub print_types : prototype($) {
             for my $variant ($def->{variants}->@*) {
                 my ($orig, $named) = @$variant;
                 print {$out} "    #[serde(rename = \"$orig\")]\n" if $named ne $orig;
+                print {$out} "    #[default]\n" if $def->{default} && $def->{default} eq $named;
                 print {$out} "    /// $orig.\n";
                 print {$out} "    $named,\n";
             };
@@ -982,6 +983,7 @@ sub generate_enum : prototype($$;$) {
     if (defined($default)) {
         if (defined($rust_default)) {
             $def->{default} = $rust_default;
+            $def->{derive} = derive_default(qw(Clone Copy Default Eq PartialEq));
         } else {
             warn "non-existent default enum value '$default'\n" if !defined($rust_default);
         }
diff --git a/pve-api-types/src/generated/types.rs b/pve-api-types/src/generated/types.rs
index c64da8b..63be171 100644
--- a/pve-api-types/src/generated/types.rs
+++ b/pve-api-types/src/generated/types.rs
@@ -1319,9 +1319,10 @@ pub struct ListTasksResponse {
 
 #[api]
 /// List archived, active or all tasks.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum ListTasksSource {
     #[serde(rename = "archive")]
+    #[default]
     /// archive.
     Archive,
     #[serde(rename = "active")]
@@ -1704,9 +1705,10 @@ generate_array_field! {
 
 #[api]
 /// OS architecture type.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum LxcConfigArch {
     #[serde(rename = "amd64")]
+    #[default]
     /// amd64.
     Amd64,
     #[serde(rename = "i386")]
@@ -1733,7 +1735,7 @@ serde_plain::derive_fromstr_from_deserialize!(LxcConfigArch);
 /// one of the available tty devices. By setting cmode to 'console' it tries to
 /// attach to /dev/console instead. If you set cmode to 'shell', it simply
 /// invokes a shell inside the container (no login).
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum LxcConfigCmode {
     #[serde(rename = "shell")]
     /// shell.
@@ -1742,6 +1744,7 @@ pub enum LxcConfigCmode {
     /// console.
     Console,
     #[serde(rename = "tty")]
+    #[default]
     /// tty.
     Tty,
 }
@@ -4567,12 +4570,13 @@ serde_plain::derive_fromstr_from_deserialize!(PveQmIdeFormat);
 
 #[api]
 /// The drive's media type.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum PveQmIdeMedia {
     #[serde(rename = "cdrom")]
     /// cdrom.
     Cdrom,
     #[serde(rename = "disk")]
+    #[default]
     /// disk.
     Disk,
 }
@@ -4862,9 +4866,10 @@ serde_plain::derive_fromstr_from_deserialize!(PveQmWatchdogAction);
 
 #[api]
 /// Watchdog type to emulate.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum PveQmWatchdogModel {
     #[serde(rename = "i6300esb")]
+    #[default]
     /// i6300esb.
     I6300esb,
     #[serde(rename = "ib700")]
@@ -4949,7 +4954,7 @@ pub struct PveVmCpuConf {
 /// CPU model and vendor to report to the guest. Must be a QEMU/KVM supported
 /// model. Only valid for custom CPU model definitions, default models will
 /// always report themselves to the guest OS.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum PveVmCpuConfReportedModel {
     #[serde(rename = "486")]
     /// 486.
@@ -5080,6 +5085,7 @@ pub enum PveVmCpuConfReportedModel {
     /// kvm32.
     Kvm32,
     #[serde(rename = "kvm64")]
+    #[default]
     /// kvm64.
     Kvm64,
     #[serde(rename = "max")]
@@ -6129,9 +6135,10 @@ pub struct QemuConfigAgent {
 
 #[api]
 /// Select the agent type
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigAgentType {
     #[serde(rename = "virtio")]
+    #[default]
     /// virtio.
     Virtio,
     #[serde(rename = "isa")]
@@ -6194,9 +6201,10 @@ serde_plain::derive_fromstr_from_deserialize!(QemuConfigAudio0Device);
 
 #[api]
 /// Driver backend for the audio device.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigAudio0Driver {
     #[serde(rename = "spice")]
+    #[default]
     /// spice.
     Spice,
     #[serde(rename = "none")]
@@ -6208,9 +6216,10 @@ serde_plain::derive_fromstr_from_deserialize!(QemuConfigAudio0Driver);
 
 #[api]
 /// Select BIOS implementation.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigBios {
     #[serde(rename = "seabios")]
+    #[default]
     /// seabios.
     Seabios,
     #[serde(rename = "ovmf")]
@@ -6301,9 +6310,10 @@ pub struct QemuConfigEfidisk0 {
 /// Size and type of the OVMF EFI vars. '4m' is newer and recommended, and
 /// required for Secure Boot. For backwards compatibility, '2m' is used if not
 /// otherwise specified. Ignored for VMs with arch=aarch64 (ARM).
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigEfidisk0Efitype {
     #[serde(rename = "2m")]
+    #[default]
     /// 2m.
     Mb2,
     #[serde(rename = "4m")]
@@ -7625,9 +7635,10 @@ pub struct QemuConfigScsi {
 
 #[api]
 /// SCSI controller model
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigScsihw {
     #[serde(rename = "lsi")]
+    #[default]
     /// lsi.
     Lsi,
     #[serde(rename = "lsi53c810")]
@@ -7676,9 +7687,10 @@ pub struct QemuConfigSpiceEnhancements {
 
 #[api]
 /// Enable video streaming. Uses compression for detected video streams.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigSpiceEnhancementsVideostreaming {
     #[serde(rename = "off")]
+    #[default]
     /// off.
     Off,
     #[serde(rename = "all")]
@@ -7732,9 +7744,10 @@ pub struct QemuConfigTpmstate0 {
 #[api]
 /// The TPM interface version. v2.0 is newer and should be preferred. Note that
 /// this cannot be changed later on.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigTpmstate0Version {
     #[serde(rename = "v1.2")]
+    #[default]
     /// v1.2.
     V1_2,
     #[serde(rename = "v2.0")]
@@ -7869,7 +7882,7 @@ serde_plain::derive_fromstr_from_deserialize!(QemuConfigVgaClipboard);
 
 #[api]
 /// Select the VGA type. Using type 'cirrus' is not recommended.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigVgaType {
     #[serde(rename = "cirrus")]
     /// cirrus.
@@ -7902,6 +7915,7 @@ pub enum QemuConfigVgaType {
     /// serial3.
     Serial3,
     #[serde(rename = "std")]
+    #[default]
     /// std.
     Std,
     #[serde(rename = "virtio")]
@@ -8341,9 +8355,10 @@ pub struct QemuConfigVirtiofs {
 #[api]
 /// The caching policy the file system should use (auto, always, metadata,
 /// never).
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum QemuConfigVirtiofsCache {
     #[serde(rename = "auto")]
+    #[default]
     /// auto.
     Auto,
     #[serde(rename = "always")]
-- 
2.39.5





More information about the pdm-devel mailing list