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},
};
#[derive(Debug)]
pub struct SystemSuite<'a> {
url: &'a Url,
}
impl<'a> SystemSuite<'a> {
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(())
}
}