use serde::Deserialize;
use serde_json::Value;
use crate::HashMap;
use crate::elements::{FileResult, Framework, Report, RunInfo, Thresholds};
const UNKNOWN: &str = "unknown";
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct Incoming {
schema_version: String,
thresholds: Thresholds,
project_root: Option<String>,
framework: Option<IncomingFramework>,
files: HashMap<String, FileResult>,
config: Option<Value>,
}
#[derive(Debug, Deserialize)]
struct IncomingFramework {
name: String,
version: Option<String>,
}
impl From<Incoming> for Report {
fn from(incoming: Incoming) -> Self {
let framework = incoming.framework.map_or_else(
|| Framework {
name: UNKNOWN.to_owned(),
version: UNKNOWN.to_owned(),
},
|framework| Framework {
name: framework.name,
version: framework.version.unwrap_or_else(|| UNKNOWN.to_owned()),
},
);
let config = incoming.config.and_then(|config| serde_json::from_value::<RunInfo>(config).ok());
Self {
schema_version: incoming.schema_version,
thresholds: incoming.thresholds,
project_root: incoming.project_root,
framework,
files: incoming.files.into_iter().collect(),
config,
}
}
}
impl Incoming {
pub(super) fn has_supported_schema_version(&self) -> bool {
crate::elements::supported_schema_version(&self.schema_version)
}
pub(super) fn schema_version(&self) -> &str {
&self.schema_version
}
}