in guard/src/commands/validate.rs [527:572]
fn evaluate_against_data_input<'r>(data_type: Type,
output: OutputFormatType,
data_files: &'r [(String, String)],
rules: &RulesFile<'_>,
rules_file_name: &'r str,
verbose: bool,
print_json: bool,
show_clause_failures: bool,
summary_table: BitFlags<SummaryType>) -> Result<Status> {
let iterator: Result<Vec<(PathAwareValue, &str)>> = data_files.iter().map(|(content, name)|
match serde_json::from_str::<serde_json::Value>(content) {
Ok(value) => Ok((PathAwareValue::try_from(value)?, name.as_str())),
Err(_) => {
let value = serde_yaml::from_str::<serde_json::Value>(content)?;
Ok((PathAwareValue::try_from(value)?, name.as_str()))
}
}
).collect();
let mut overall = Status::PASS;
for (each, data_file_name) in iterator? {
let mut reporters = match data_type {
Type::CFNTemplate =>
vec![
Box::new(cfn_reporter::CfnReporter::new(data_file_name, rules_file_name, output)) as Box<dyn Reporter>],
Type::Generic =>
vec![
Box::new(generic_summary::GenericSummary::new(data_file_name, rules_file_name, output)) as Box<dyn Reporter>],
};
if !summary_table.is_empty() {
reporters.insert(
0, Box::new(
summary_table::SummaryTable::new(rules_file_name, data_file_name, summary_table.clone())) as Box<dyn Reporter>);
}
let root_context = RootScope::new(rules, &each);
let stacker = StackTracker::new(&root_context);
let reporter = ConsoleReporter::new(stacker, &reporters, rules_file_name, data_file_name, verbose, print_json, show_clause_failures);
let appender = MetadataAppender{delegate: &reporter, root_context: &each};
let status = rules.evaluate(&each, &appender)?;
reporter.report()?;
if status == Status::FAIL {
overall = Status::FAIL
}
}
Ok(overall)
}