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 url::Url;

use crate::{
    Optionality,
    common::fields::{
        CREATED_FIELD_NAME, IdFieldSuite, MODIFIED_FIELD_NAME, TimestampFieldSuite, TypeFieldSuite,
    },
    http::{HttpJsonObjectSuite, HttpRequestSuite},
};

#[derive(Debug)]
pub(crate) struct EntityRequestSuite<'a> {
    url: &'a Url,
    namespace: &'a str,
}

impl<'a> EntityRequestSuite<'a> {
    pub fn new(url: &'a Url, namespace: &'a str) -> Self {
        Self { url, namespace }
    }
}

#[async_trait::async_trait]
impl<'a> LintSuite for EntityRequestSuite<'a> {
    type Output = serde_json::Map<String, serde_json::Value>;

    fn identifier(&self) -> String {
        "entity-request".into()
    }

    fn title(&self) -> String {
        format!(
            "Request to entity endpoint {} performs as expected",
            self.url
        )
    }

    async fn execute<L: oparlint_linting::Linter + Send>(
        self,
        linter: &mut L,
    ) -> LintingResult<Self::Output> {
        let response = linter
            .execute_suite(HttpRequestSuite::new(self.url))
            .await?;
        let object = linter
            .execute_suite(HttpJsonObjectSuite::new(response))
            .await?;
        _ = linter
            .execute_suite(IdFieldSuite::new(&object, self.url))
            .await;
        _ = linter
            .execute_suite(TypeFieldSuite::new(&object, self.namespace))
            .await;
        _ = linter
            .execute_suite(TimestampFieldSuite::new(
                CREATED_FIELD_NAME,
                Optionality::Required,
                &object,
            ))
            .await;
        _ = linter
            .execute_suite(TimestampFieldSuite::new(
                MODIFIED_FIELD_NAME,
                Optionality::Required,
                &object,
            ))
            .await;

        Ok(object)
    }
}