#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum AdapterCategory {
Http,
Database,
Messaging,
Tls,
Transport,
}
impl AdapterCategory {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Http => "http",
Self::Database => "database",
Self::Messaging => "messaging",
Self::Tls => "tls",
Self::Transport => "transport",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum AdapterCertificationStatus {
CertifiedLive,
CertifiedOptIn,
PartialFailClosed,
UnavailableFailClosed,
}
impl AdapterCertificationStatus {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::CertifiedLive => "certified_live",
Self::CertifiedOptIn => "certified_opt_in",
Self::PartialFailClosed => "partial_fail_closed",
Self::UnavailableFailClosed => "unavailable_fail_closed",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum AdapterRenderedStatus {
Pass,
Xfail,
Blocked,
}
impl AdapterRenderedStatus {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Pass => "PASS",
Self::Xfail => "XFAIL",
Self::Blocked => "BLOCKED",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AdapterCertificationDeclaration {
pub adapter_id: &'static str,
pub category: AdapterCategory,
pub certification_status: AdapterCertificationStatus,
pub rendered_status: AdapterRenderedStatus,
pub fail_closed_without_full_reference: bool,
}
pub const ADAPTER_CERTIFICATIONS: &[AdapterCertificationDeclaration] = &[
AdapterCertificationDeclaration {
adapter_id: "http-h1-h2",
category: AdapterCategory::Http,
certification_status: AdapterCertificationStatus::CertifiedLive,
rendered_status: AdapterRenderedStatus::Pass,
fail_closed_without_full_reference: false,
},
AdapterCertificationDeclaration {
adapter_id: "database-postgres-mysql-sqlite",
category: AdapterCategory::Database,
certification_status: AdapterCertificationStatus::PartialFailClosed,
rendered_status: AdapterRenderedStatus::Xfail,
fail_closed_without_full_reference: true,
},
AdapterCertificationDeclaration {
adapter_id: "messaging-nats-jetstream-kafka-redis",
category: AdapterCategory::Messaging,
certification_status: AdapterCertificationStatus::PartialFailClosed,
rendered_status: AdapterRenderedStatus::Xfail,
fail_closed_without_full_reference: true,
},
AdapterCertificationDeclaration {
adapter_id: "tls-rustls",
category: AdapterCategory::Tls,
certification_status: AdapterCertificationStatus::CertifiedOptIn,
rendered_status: AdapterRenderedStatus::Pass,
fail_closed_without_full_reference: false,
},
AdapterCertificationDeclaration {
adapter_id: "transport-quic-websocket-router",
category: AdapterCategory::Transport,
certification_status: AdapterCertificationStatus::PartialFailClosed,
rendered_status: AdapterRenderedStatus::Xfail,
fail_closed_without_full_reference: true,
},
];
#[must_use]
pub fn adapter_certification(adapter_id: &str) -> Option<&'static AdapterCertificationDeclaration> {
ADAPTER_CERTIFICATIONS
.iter()
.find(|declaration| declaration.adapter_id == adapter_id)
}
#[cfg(test)]
mod tests {
use super::{
ADAPTER_CERTIFICATIONS, AdapterCategory, AdapterCertificationStatus, AdapterRenderedStatus,
adapter_certification,
};
#[test]
fn adapter_certifications_have_stable_ids_and_statuses() {
assert_eq!(ADAPTER_CERTIFICATIONS.len(), 5);
let http = adapter_certification("http-h1-h2").expect("http adapter");
assert_eq!(http.category, AdapterCategory::Http);
assert_eq!(
http.certification_status,
AdapterCertificationStatus::CertifiedLive
);
assert_eq!(http.rendered_status, AdapterRenderedStatus::Pass);
assert!(!http.fail_closed_without_full_reference);
let database =
adapter_certification("database-postgres-mysql-sqlite").expect("database adapter");
assert_eq!(
database.certification_status,
AdapterCertificationStatus::PartialFailClosed
);
assert_eq!(database.rendered_status, AdapterRenderedStatus::Xfail);
assert!(database.fail_closed_without_full_reference);
}
}