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::{
            BODY_FIELD_NAME, CONTACT_EMAIL_FIELD_NAME, EmailFieldSuite, LICENSE_FIELD_NAME,
            NAMESPACE_URL_SYSTEM, PRODUCT_FIELD_NAME, UrlFieldSuite, VENDOR_FIELD_NAME,
            WEB_FIELD_NAME, WEBSITE_FIELD_NAME,
        },
        requests::EntityRequestSuite,
    },
    system::{OParlVersionFieldSuite, OtherOParlVersionsSuite},
};

/// Lint suite to check an OParl System.
#[derive(Debug)]
pub struct SystemSuite<'a> {
    url: &'a Url,
}

impl<'a> SystemSuite<'a> {
    /// Create a new system lint suite.
    pub fn new(url: &'a Url) -> Self {
        Self { url }
    }
}

#[async_trait::async_trait]
impl<'a> LintSuite for SystemSuite<'a> {
    type Output = ();

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

    fn title(&self) -> String {
        "Request to OParl system endpoint performs as expected".into()
    }

    async fn execute<L: oparlint_linting::Linter + Send>(self, linter: &mut L) -> LintingResult {
        let object = linter
            .execute_suite(EntityRequestSuite::new(self.url, NAMESPACE_URL_SYSTEM))
            .await?;

        _ = linter
            .execute_suite(OParlVersionFieldSuite::new(&object))
            .await;
        _ = linter
            .execute_suite(OtherOParlVersionsSuite::new(&object))
            .await;
        _ = linter
            .execute_suite(UrlFieldSuite::new(
                LICENSE_FIELD_NAME,
                Optionality::Optional,
                &object,
            ))
            .await;
        _ = linter
            .execute_suite(UrlFieldSuite::new(
                BODY_FIELD_NAME,
                Optionality::Required,
                &object,
            ))
            .await;
        _ = linter
            .execute_suite(UrlFieldSuite::new(
                WEBSITE_FIELD_NAME,
                Optionality::Optional,
                &object,
            ))
            .await;
        _ = linter
            .execute_suite(UrlFieldSuite::new(
                VENDOR_FIELD_NAME,
                Optionality::Optional,
                &object,
            ))
            .await;
        _ = linter
            .execute_suite(UrlFieldSuite::new(
                PRODUCT_FIELD_NAME,
                Optionality::Optional,
                &object,
            ))
            .await;
        _ = linter
            .execute_suite(EmailFieldSuite::new(
                CONTACT_EMAIL_FIELD_NAME,
                Optionality::Optional,
                &object,
            ))
            .await;
        _ = linter
            .execute_suite(UrlFieldSuite::new(
                WEB_FIELD_NAME,
                Optionality::Optional,
                &object,
            ))
            .await;

        Ok(())
    }
}