+use serde::Deserialize;
use std::net::{IpAddr, Ipv4Addr};
use std::{cmp, fmt};
};
use crate::utils::{CidrAddress, Fqdn};
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Deserialize, Eq, PartialEq)]
+#[serde(rename_all = "lowercase")]
pub enum BtrfsRaidLevel {
Raid0,
Raid1,
}
}
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Deserialize, Eq, PartialEq)]
+#[serde(rename_all = "lowercase")]
pub enum ZfsRaidLevel {
Raid0,
Raid1,
Raid10,
+ #[serde(rename = "raidz-1")]
RaidZ,
+ #[serde(rename = "raidz-2")]
RaidZ2,
+ #[serde(rename = "raidz-3")]
RaidZ3,
}
}
}
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Deserialize, Eq, PartialEq)]
+#[serde(rename_all = "lowercase")]
pub enum FsType {
Ext4,
Xfs,
}
}
-#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Default, Deserialize, Eq, PartialEq)]
+#[serde(rename_all(deserialize = "lowercase"))]
pub enum ZfsCompressOption {
#[default]
On,
&[On, Off, Lzjb, Lz4, Zle, Gzip, Zstd]
};
-#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Default, Deserialize, Eq, PartialEq)]
+#[serde(rename_all = "kebab-case")]
pub enum ZfsChecksumOption {
#[default]
On,
Btrfs(BtrfsBootdiskOptions),
}
-#[derive(Clone, Debug, PartialEq)]
+#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Disk {
pub index: String,
pub path: String,
}
}
-#[derive(Serialize)]
+#[derive(Debug, Deserialize, Serialize)]
pub struct InstallZfsOption {
pub ashift: usize,
#[serde(serialize_with = "serialize_as_display")]
}
/// See Proxmox::Install::Config
-#[derive(Serialize)]
+#[derive(Debug, Deserialize, Serialize)]
pub struct InstallConfig {
pub autoreboot: usize,
- #[serde(serialize_with = "serialize_fstype")]
+ #[serde(serialize_with = "serialize_fstype", deserialize_with = "deserialize_fs_type")]
pub filesys: FsType,
pub hdsize: f64,
#[serde(skip_serializing_if = "Option::is_none")]
serializer.collect_str(value)
}
+
+pub fn deserialize_fs_type<'de, D>(deserializer: D) -> Result<FsType, D::Error>
+where
+ D: Deserializer<'de>,
+{
+ use FsType::*;
+ let de_fs: String = Deserialize::deserialize(deserializer)?;
+
+ println!("deserializing fstype");
+ match de_fs.as_str() {
+ "ext4" => Ok(Ext4),
+ "xfs" => Ok(Xfs),
+ "zfs (RAID0)" => Ok(Zfs(ZfsRaidLevel::Raid0)),
+ "zfs (RAID1)" => Ok(Zfs(ZfsRaidLevel::Raid1)),
+ "zfs (RAID10)" => Ok(Zfs(ZfsRaidLevel::Raid10)),
+ "zfs (RAIDZ-1)" => Ok(Zfs(ZfsRaidLevel::RaidZ)),
+ "zfs (RAIDZ-2)" => Ok(Zfs(ZfsRaidLevel::RaidZ2)),
+ "zfs (RAIDZ-3)" => Ok(Zfs(ZfsRaidLevel::RaidZ3)),
+ "btrfs (RAID0)" => Ok(Btrfs(BtrfsRaidLevel::Raid0)),
+ "btrfs (RAID1)" => Ok(Btrfs(BtrfsRaidLevel::Raid1)),
+ "btrfs (RAID10)" => Ok(Btrfs(BtrfsRaidLevel::Raid10)),
+ _ => Err(de::Error::custom("could not find file system: {de_fs}"))
+ }
+}