use crate::error::OciSpecError;
use derive_builder::Builder;
use getset::{CopyGetters, Getters, Setters};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use strum_macros::Display as StrumDisplay;
#[derive(
Builder,
Clone,
Debug,
Default,
Deserialize,
CopyGetters,
Getters,
Setters,
Eq,
PartialEq,
Serialize,
)]
#[builder(
default,
pattern = "owned",
setter(into, strip_option),
build_fn(error = "OciSpecError")
)]
#[getset(get = "pub", set = "pub")]
pub struct ZOS {
#[serde(default, skip_serializing_if = "Option::is_none")]
namespaces: Option<Vec<ZOSNamespace>>,
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize, Hash, StrumDisplay,
)]
#[strum(serialize_all = "lowercase")]
#[serde(rename_all = "lowercase")]
pub enum ZOSNamespaceType {
#[default]
Pid,
Mount,
Ipc,
Uts,
}
impl TryFrom<&str> for ZOSNamespaceType {
type Error = OciSpecError;
fn try_from(namespace: &str) -> Result<Self, Self::Error> {
match namespace {
"pid" => Ok(ZOSNamespaceType::Pid),
"mount" => Ok(ZOSNamespaceType::Mount),
"ipc" => Ok(ZOSNamespaceType::Ipc),
"uts" => Ok(ZOSNamespaceType::Uts),
_ => Err(OciSpecError::Other(format!(
"unknown z/OS namespace {namespace}, could not convert"
))),
}
}
}
#[derive(
Builder,
Clone,
CopyGetters,
Debug,
Default,
Deserialize,
Eq,
Getters,
Setters,
PartialEq,
Serialize,
)]
#[builder(
default,
pattern = "owned",
setter(into, strip_option),
build_fn(error = "OciSpecError")
)]
pub struct ZOSNamespace {
#[serde(rename = "type")]
#[getset(get_copy = "pub", set = "pub")]
typ: ZOSNamespaceType,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[getset(get = "pub", set = "pub")]
path: Option<PathBuf>,
}