use indexmap::IndexMap;
use serde::Deserialize;
use ::Value;
use ::codec::{SerializeValue, DeserializeValue};
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct Outputs(IndexMap<String, ::serde_json::Value>);
impl Outputs {
pub fn get<T: DeserializeValue>(&self, id: &str) -> Result<Output<T>, ::Error> {
self.0.get(id)
.ok_or_else(|| ::Error::new(::ErrorKind::NotFound,
format_args!("output with logical id {} not found", id)))
.and_then(|inner| {
Output::deserialize(inner)
.map_err(|err| ::Error::new(::ErrorKind::Serialization, err))
})
}
pub fn has(&self, id: &str) -> bool {
self.0.contains_key(id)
}
pub fn set<T: SerializeValue>(&mut self, id: &str, output: Output<T>) {
let inner = ::serde_json::to_value(output).unwrap();
self.0.insert(id.to_owned(), inner);
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(bound(serialize = "T: SerializeValue", deserialize = "T: DeserializeValue"))]
pub struct Output<T> {
#[serde(rename = "Value")]
pub value: Value<T>
}