use crate::operation::{OperationId, OperationImpact, PreparedRequest};
use crate::transport::StatusCode;
use crate::{ProviderId, ServiceId};
use super::{DiagnosticErrorCategory, DiagnosticRequestId, DiagnosticRetryCategory};
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct DiagnosticContext {
provider: ProviderId,
service: ServiceId,
operation: Option<OperationId>,
impact: OperationImpact,
retry: DiagnosticRetryCategory,
}
impl DiagnosticContext {
pub(crate) const fn new(
provider: ProviderId,
service: ServiceId,
operation: Option<OperationId>,
impact: OperationImpact,
retry: DiagnosticRetryCategory,
) -> Self {
Self {
provider,
service,
operation,
impact,
retry,
}
}
pub(crate) fn from_prepared(prepared: &PreparedRequest<'_>) -> Self {
let service = prepared.service();
Self::new(
service.provider_id(),
service.service_id(),
prepared.operation_id(),
prepared.metadata().impact(),
prepared.metadata().retry_eligibility().into(),
)
}
#[must_use]
pub const fn provider(self) -> ProviderId {
self.provider
}
#[must_use]
pub const fn service(self) -> ServiceId {
self.service
}
#[must_use]
pub const fn operation(self) -> Option<OperationId> {
self.operation
}
#[must_use]
pub const fn impact(self) -> OperationImpact {
self.impact
}
#[must_use]
pub const fn retry(self) -> DiagnosticRetryCategory {
self.retry
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct DiagnosticResponse {
status: StatusCode,
request_id: DiagnosticRequestId,
}
impl DiagnosticResponse {
pub(crate) const fn new(status: StatusCode, request_id: DiagnosticRequestId) -> Self {
Self { status, request_id }
}
#[must_use]
pub const fn status(self) -> StatusCode {
self.status
}
#[must_use]
pub const fn request_id(self) -> DiagnosticRequestId {
self.request_id
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum DiagnosticEvent {
PreparationStarted,
PreparationFailed {
error: DiagnosticErrorCategory,
},
RequestPrepared {
context: DiagnosticContext,
},
DispatchStarted {
context: DiagnosticContext,
},
ExecutionFailed {
context: DiagnosticContext,
error: DiagnosticErrorCategory,
},
ResponseReceived {
context: DiagnosticContext,
response: DiagnosticResponse,
},
DecodeFailed {
context: DiagnosticContext,
response: Option<DiagnosticResponse>,
error: DiagnosticErrorCategory,
},
Completed {
context: DiagnosticContext,
response: Option<DiagnosticResponse>,
},
}