1#![forbid(unsafe_code)]
7
8use inspect::Inspect;
9use std::convert::Infallible;
10use std::sync::Arc;
11use vm_resource::CanResolveTo;
12use vm_resource::PlatformResource;
13use vm_resource::ResolveResource;
14use vm_resource::ResourceKind;
15
16pub trait GetReferenceTime: Send + Sync {
18 fn now(&self) -> ReferenceTimeResult;
20}
21
22pub struct ReferenceTimeResult {
24 pub ref_time: u64,
26 pub system_time: Option<jiff::Timestamp>,
32}
33
34pub enum ReferenceTimeSourceKind {}
39
40impl ResourceKind for ReferenceTimeSourceKind {
41 const NAME: &'static str = "ref_time";
42}
43
44impl CanResolveTo<ReferenceTimeSource> for ReferenceTimeSourceKind {
45 type Input<'a> = ();
46}
47
48#[derive(Clone)]
51pub struct ReferenceTimeSource(Arc<dyn GetReferenceTime>);
52
53impl ReferenceTimeSource {
54 pub fn new<T: GetReferenceTime + 'static>(time_source: T) -> Self {
56 Self(Arc::new(time_source))
57 }
58
59 pub fn now(&self) -> ReferenceTimeResult {
61 self.0.now()
62 }
63}
64
65impl Inspect for ReferenceTimeSource {
66 fn inspect(&self, req: inspect::Request<'_>) {
67 let now = self.now();
68 req.respond()
69 .field("ref_time", now.ref_time)
70 .field("system_time", now.system_time.map(inspect::AsDisplay));
71 }
72}
73
74impl From<Arc<dyn GetReferenceTime>> for ReferenceTimeSource {
75 fn from(value: Arc<dyn GetReferenceTime>) -> Self {
76 Self(value)
77 }
78}
79
80impl ResolveResource<ReferenceTimeSourceKind, PlatformResource> for ReferenceTimeSource {
81 type Output = ReferenceTimeSource;
82 type Error = Infallible;
83
84 fn resolve(
85 &self,
86 PlatformResource: PlatformResource,
87 (): (),
88 ) -> Result<Self::Output, Self::Error> {
89 Ok(self.clone())
90 }
91}