1extern crate serde;
4#[cfg_attr(test, macro_use)]
5extern crate serde_json;
6extern crate url;
7#[macro_use]
8extern crate serde_derive;
9extern crate serde_urlencoded;
10extern crate serde_yaml;
11#[macro_use]
12extern crate failure;
13extern crate base64;
14extern crate futures;
15extern crate hyper;
16extern crate hyper_tls;
17extern crate native_tls;
18extern crate openssl;
19extern crate tokio_core;
20#[macro_use]
21extern crate log;
22
23pub mod api;
24pub mod client;
25mod groupversion;
26mod serde_base64;
27mod unstructured;
28
29use std::borrow::Cow;
30use std::slice;
31
32use api::meta::v1::{ListMeta, ObjectMeta};
33
34pub use groupversion::*;
35pub use unstructured::*;
36
37pub trait Metadata {
38 fn api_version(&self) -> &str;
39 fn kind(&self) -> &str;
40 fn metadata(&self) -> Cow<ObjectMeta>;
41}
42
43pub trait List<T> {
44 fn listmeta(&self) -> Cow<ListMeta>;
45 fn items(&self) -> &[T];
46 fn items_mut(&mut self) -> &mut [T];
47 fn into_items(self) -> Vec<T>;
48}
49
50impl<'a, T> IntoIterator for &'a List<T> {
51 type Item = &'a T;
52 type IntoIter = slice::Iter<'a, T>;
53
54 fn into_iter(self) -> Self::IntoIter {
55 self.items().into_iter()
56 }
57}
58
59impl<'a, T> IntoIterator for &'a mut List<T> {
60 type Item = &'a mut T;
61 type IntoIter = slice::IterMut<'a, T>;
62
63 fn into_iter(self) -> Self::IntoIter {
64 self.items_mut().iter_mut()
65 }
66}
67
68#[cfg(test)]
69mod tests {
70 use super::Metadata;
71 use serde_json::{self, Value};
72
73 fn pod_json() -> Value {
74 json!({
75 "apiVersion": "v1",
76 "kind": "Pod",
77 "metadata": {
78 "name": "pod-example",
79 },
80 "spec": {
81 "containers": [
82 {
83 "image": "busybox",
84 "command": ["echo"],
85 "args": ["Hello world"],
86 },
87 ],
88 },
89 })
90 }
91
92 #[test]
93 fn untyped() {
94 let j = pod_json();
95 assert_eq!(j.kind(), "Pod");
96 assert_eq!(j.api_version(), "v1");
97 assert_eq!(j.metadata().name.as_ref().unwrap(), "pod-example");
98 }
99
100 #[test]
101 fn typed() {
102 use api::core::v1::Pod;
103 let pod: Pod = serde_json::from_value(pod_json()).unwrap();
104 assert_eq!(pod.spec.containers[0].image, Some("busybox".into()));
105 }
106}