use std::fmt::Display;
use async_trait::async_trait;
use url::Url;
use crate::app_types::{ApplicationName, PdpID};
use crate::lock::health_registry::SystemHealth;
use crate::log::{DecisionLogEntry, MetricsLogEntry};
use mapping::LockServerHealthEntry;
#[cfg(feature = "grpc")]
pub(super) mod grpc;
pub(super) mod mapping;
pub(super) mod rest;
#[cfg(test)]
pub(super) mod test_utils;
#[derive(Clone)]
pub(crate) enum AuditPayload {
Decision(Box<DecisionLogEntry>),
Metric(Box<MetricsLogEntry>),
Health(Box<LockServerHealthEntry>),
}
#[derive(Clone)]
pub(crate) struct AuditItem {
pub payload: AuditPayload,
pub pdp_id: PdpID,
pub app_name: Option<ApplicationName>,
pub status: Option<SystemHealth>,
}
pub(super) type TransportResult<T> = Result<T, TransportError>;
#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) enum AuditKind {
Log(Url),
Telemetry(Url),
Health(Url),
}
impl AuditKind {
pub(super) fn url(&self) -> &Url {
match self {
AuditKind::Log(url) | AuditKind::Telemetry(url) | AuditKind::Health(url) => url,
}
}
}
impl Display for AuditKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AuditKind::Log(_) => write!(f, "log"),
AuditKind::Telemetry(_) => write!(f, "telemetry"),
AuditKind::Health(_) => write!(f, "health"),
}
}
}
#[cfg_attr(not(any(target_arch = "wasm32", target_arch = "wasm64")), async_trait)]
#[cfg_attr(any(target_arch = "wasm32", target_arch = "wasm64"), async_trait(?Send))]
pub(super) trait AuditTransport: Send + Sync {
async fn send(&self, entries: &[AuditItem], audit_kind: &AuditKind) -> TransportResult<()>;
}
#[derive(Debug, thiserror::Error)]
pub enum TransportError {
#[error("REST transport error: {0}")]
Rest(#[from] reqwest::Error),
#[error("gRPC transport error: {0}")]
#[cfg(feature = "grpc")]
Grpc(#[from] tonic::Status),
#[cfg(not(target_arch = "wasm32"))]
#[cfg(feature = "grpc")]
#[error("gRPC connection error: {0}")]
GrpcConnection(#[from] tonic::transport::Error),
#[error("gRPC server responded with an error: {0}")]
#[cfg(feature = "grpc")]
GrpcServer(String),
#[error("invalid gRPC endpoint URL: {0}")]
#[cfg(feature = "grpc")]
InvalidUri(String),
#[error("failed to parse access token: {0}")]
#[cfg(feature = "grpc")]
InvalidAccessToken(#[from] tonic::metadata::errors::InvalidMetadataValue),
#[error("serialization error: {0}")]
Serialization(String),
}