oparlint-suites 0.0.2

Lint suites that can be run by oparlint
Documentation
// SPDX-FileCopyrightText: Politik im Blick developers
// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
//
// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2

use oparlint_linting::{LintSuite, LintingResult};
use oparlint_lints::{
    entities::system::ValidOParlVersionLint,
    json::{FieldIsStringLint, ObjectContainsFieldLint},
};
use serde_json::{Map, Value};

/// A lint suite for verifying the validity of the `oparlVersion` field.
#[derive(Debug)]
pub struct OParlVersionFieldSuite<'a> {
    fields: &'a Map<String, Value>,
}

impl<'a> OParlVersionFieldSuite<'a> {
    /// Create a new system lint suite.
    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(())
    }
}