1use std::sync::Arc;
8use tpm_resources::TpmLoggerKind;
9use vm_resource::CanResolveTo;
10
11pub enum TpmLogEvent {
13 AkCertRenewalFailed,
15 IdentityChangeFailed,
17 InvalidState,
19}
20
21impl CanResolveTo<ResolvedTpmLogger> for TpmLoggerKind {
22 type Input<'a> = &'a ();
24}
25
26pub struct ResolvedTpmLogger(pub Arc<dyn TpmLogger>);
28
29impl<T: 'static + TpmLogger> From<T> for ResolvedTpmLogger {
30 fn from(value: T) -> Self {
31 Self(Arc::new(value))
32 }
33}
34
35#[async_trait::async_trait]
37pub trait TpmLogger: Send + Sync {
38 async fn log_event_and_flush(&self, event: TpmLogEvent);
40
41 fn log_event(&self, event: TpmLogEvent);
46}
47
48#[async_trait::async_trait]
49impl TpmLogger for Option<Arc<dyn TpmLogger>> {
50 async fn log_event_and_flush(&self, event: TpmLogEvent) {
51 if let Some(logger) = self {
52 logger.log_event_and_flush(event).await;
53 }
54 }
55
56 fn log_event(&self, event: TpmLogEvent) {
57 if let Some(logger) = self {
58 logger.log_event(event);
59 }
60 }
61}