use oparlint_linting::{LintSuite, LintingResult};
use oparlint_lints::{
entities::system::ValidOParlVersionLint,
json::{FieldIsStringLint, ObjectContainsFieldLint},
};
use serde_json::{Map, Value};
#[derive(Debug)]
pub struct OParlVersionFieldSuite<'a> {
fields: &'a Map<String, Value>,
}
impl<'a> OParlVersionFieldSuite<'a> {
pub fn new(fields: &'a Map<String, Value>) -> Self {
Self { fields }
}
}
const FIELD_NAME: &str = "oparlVersion";
#[async_trait::async_trait]
impl<'a> LintSuite for OParlVersionFieldSuite<'a> {
type Output = ();
fn identifier(&self) -> String {
"oparl-version-field".into()
}
fn title(&self) -> String {
format!("JSON object contains a valid `{FIELD_NAME}` field")
}
async fn execute<L: oparlint_linting::Linter + Send>(self, linter: &mut L) -> LintingResult {
let field_value =
linter.execute_lint(ObjectContainsFieldLint::new(FIELD_NAME, self.fields))?;
let field_value = linter.execute_lint(FieldIsStringLint::new(FIELD_NAME, field_value))?;
linter.execute_lint(ValidOParlVersionLint::new(FIELD_NAME, &field_value))?;
Ok(())
}
}