1use std::time::Instant;23use anyhow::bail;4use serde::Deserialize;5use tracing::{debug, warn};67use crate::{Value, nix_go_json};89#[derive(Deserialize, Debug)]10struct Assertion {11 assertion: bool,12 message: String,13}1415#[tracing::instrument(level = "info", skip(val))]16pub async fn assert_warn(action: &str, val: &Value) -> anyhow::Result<()> {17 let before_errors = Instant::now();18 let errors: Vec<String> = nix_go_json!(val.errors);19 20 debug!("errors evaluation took {:?} {errors:?} ", before_errors.elapsed());21 if !errors.is_empty() {22 bail!(23 "failed with error{}{}",24 if errors.len() != 1 { "s:\n- " } else { ": " },25 errors.join("\n- "),26 );27 }2829 let before_errors = Instant::now();30 let warnings: Vec<String> = nix_go_json!(val.warnings);31 debug!("warnings evaluation took {:?}", before_errors.elapsed());32 if !warnings.is_empty() {33 warn!(34 "completed with warning{}{}",35 if warnings.len() != 1 { "s:\n- " } else { ": " },36 warnings.join("\n- "),37 );38 }39 Ok(())40}