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
use api::meta::v1::{ListMeta, ObjectMeta}; use serde_json::{self, Value}; use std::borrow::Cow; use super::{List, Metadata}; impl Metadata for Value { fn kind(&self) -> &str { self["kind"].as_str().unwrap_or_default() } fn api_version(&self) -> &str { self["apiVersion"].as_str().unwrap_or_default() } fn metadata(&self) -> Cow<ObjectMeta> { serde_json::from_value(self["metadata"].clone()).unwrap_or_default() } } impl List<Value> for Value { fn listmeta(&self) -> Cow<ListMeta> { serde_json::from_value(self["metadata"].clone()).unwrap_or_default() } fn items(&self) -> &[Value] { static EMPTY: [Value; 0] = []; self["items"] .as_array() .map(Vec::as_slice) .unwrap_or(&EMPTY) } fn items_mut(&mut self) -> &mut [Value] { let vec = match *self { Value::Array(ref mut v) => v, _ => { self["items"] = Value::Array(vec![]); self["items"].as_array_mut().unwrap() } }; vec.as_mut_slice() } fn into_items(mut self) -> Vec<Value> { match self["items"].take() { Value::Array(v) => v, _ => vec![], } } }