1use crate::error::OciSpecError;
2use derive_builder::Builder;
3use getset::{CopyGetters, Getters, Setters};
4use serde::{Deserialize, Serialize};
5use std::path::PathBuf;
6use strum_macros::Display as StrumDisplay;
7
8#[derive(
9 Builder,
10 Clone,
11 Debug,
12 Default,
13 Deserialize,
14 CopyGetters,
15 Getters,
16 Setters,
17 Eq,
18 PartialEq,
19 Serialize,
20)]
21#[builder(
22 default,
23 pattern = "owned",
24 setter(into, strip_option),
25 build_fn(error = "OciSpecError")
26)]
27#[getset(get = "pub", set = "pub")]
28pub struct ZOS {
30 #[serde(default, skip_serializing_if = "Option::is_none")]
31 namespaces: Option<Vec<ZOSNamespace>>,
33}
34
35#[derive(
36 Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize, Hash, StrumDisplay,
37)]
38#[strum(serialize_all = "lowercase")]
39#[serde(rename_all = "lowercase")]
40pub enum ZOSNamespaceType {
42 #[default]
43 Pid,
45 Mount,
47 Ipc,
49 Uts,
51}
52
53impl TryFrom<&str> for ZOSNamespaceType {
54 type Error = OciSpecError;
55
56 fn try_from(namespace: &str) -> Result<Self, Self::Error> {
57 match namespace {
58 "pid" => Ok(ZOSNamespaceType::Pid),
59 "mount" => Ok(ZOSNamespaceType::Mount),
60 "ipc" => Ok(ZOSNamespaceType::Ipc),
61 "uts" => Ok(ZOSNamespaceType::Uts),
62 _ => Err(OciSpecError::Other(format!(
63 "unknown z/OS namespace {namespace}, could not convert"
64 ))),
65 }
66 }
67}
68
69#[derive(
70 Builder,
71 Clone,
72 CopyGetters,
73 Debug,
74 Default,
75 Deserialize,
76 Eq,
77 Getters,
78 Setters,
79 PartialEq,
80 Serialize,
81)]
82#[builder(
83 default,
84 pattern = "owned",
85 setter(into, strip_option),
86 build_fn(error = "OciSpecError")
87)]
88pub struct ZOSNamespace {
90 #[serde(rename = "type")]
91 #[getset(get_copy = "pub", set = "pub")]
92 typ: ZOSNamespaceType,
94
95 #[serde(default, skip_serializing_if = "Option::is_none")]
96 #[getset(get = "pub", set = "pub")]
97 path: Option<PathBuf>,
100}