1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use crate::{gvk::GroupVersionKind, resource::Resource};
use k8s_openapi::apimachinery::pkg::apis::meta::v1::APIResource;
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct ApiResource {
pub group: String,
pub version: String,
pub api_version: String,
pub kind: String,
pub plural: String,
}
impl ApiResource {
pub fn from_apiresource(ar: &APIResource, group_version: &str) -> Self {
let gvsplit = group_version.splitn(2, '/').collect::<Vec<_>>();
let (default_group, default_version) = match *gvsplit.as_slice() {
[g, v] => (g, v),
[v] => ("", v),
_ => unreachable!(),
};
let group = ar.group.clone().unwrap_or_else(|| default_group.into());
let version = ar.version.clone().unwrap_or_else(|| default_version.into());
let kind = ar.kind.to_string();
let api_version = if group.is_empty() {
version.clone()
} else {
format!("{}/{}", group, version)
};
let plural = ar.name.clone();
ApiResource {
group,
version,
api_version,
kind,
plural,
}
}
pub fn erase<K: Resource>(dt: &K::DynamicType) -> Self {
ApiResource {
group: K::group(dt).to_string(),
version: K::version(dt).to_string(),
api_version: K::api_version(dt).to_string(),
kind: K::kind(dt).to_string(),
plural: K::plural(dt).to_string(),
}
}
pub fn from_gvk(gvk: &GroupVersionKind) -> Self {
ApiResource::from_gvk_with_plural(gvk, &crate::resource::to_plural(&gvk.kind.to_ascii_lowercase()))
}
pub fn from_gvk_with_plural(gvk: &GroupVersionKind, plural: &str) -> Self {
let api_version = match gvk.group.as_str() {
"" => gvk.version.clone(),
_ => format!("{}/{}", gvk.group, gvk.version),
};
ApiResource {
group: gvk.group.clone(),
version: gvk.version.clone(),
api_version,
kind: gvk.kind.clone(),
plural: plural.to_string(),
}
}
}