use std::fmt::{self, Display, Formatter};
use serde_json::Value;
use crate::loader::SourceTrace;
use super::super::render::render_value;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ResolutionStep {
pub source: SourceTrace,
pub value: Value,
pub redacted: bool,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Explanation {
pub path: String,
pub final_value: Option<Value>,
pub steps: Vec<ResolutionStep>,
pub redacted: bool,
}
impl Display for Explanation {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let final_value = self
.final_value
.as_ref()
.map_or_else(|| "null".to_owned(), render_value);
writeln!(f, "{} = {}", self.path, final_value)?;
for step in &self.steps {
write!(f, "- {}", step.source)?;
if !step.source.name.is_empty() {
write!(f, ": ")?;
} else {
write!(f, " ")?;
}
writeln!(f, "{}", render_value(&step.value))?;
}
Ok(())
}
}