1use async_nats::HeaderMap;
2
3use wadm_types::Manifest;
4
5pub const CONTENT_TYPE_HEADER: &str = "Content-Type";
8
9const YAML_MIME: &str = "application/yaml";
12const JSON_MIME: &str = "application/json";
13
14pub fn parse_manifest(data: Vec<u8>, headers: Option<&HeaderMap>) -> anyhow::Result<Manifest> {
19 let content_type = headers
21 .and_then(|map| map.get(CONTENT_TYPE_HEADER).cloned())
22 .map(|value| value.as_str().to_owned());
23 if let Some(content_type) = content_type {
24 match content_type.as_str() {
25 JSON_MIME => serde_json::from_slice(&data).map_err(anyhow::Error::from),
26 YAML_MIME => serde_yaml::from_slice(&data).map_err(anyhow::Error::from),
27 _ => {
28 Err(anyhow::anyhow!(
31 "Unsupported content type {content_type} given. Wadm supports YAML and JSON"
32 ))
33 }
34 }
35 } else {
36 parse_yaml_or_json(data)
37 }
38}
39
40fn parse_yaml_or_json(data: Vec<u8>) -> anyhow::Result<Manifest> {
42 serde_yaml::from_slice(&data).or_else(|e| {
43 serde_json::from_slice(&data).map_err(|err| {
44 anyhow::anyhow!("JSON parsing failed: {err:?}")
46 .context(format!("YAML parsing failed: {e:?}"))
47 })
48 })
49}