use crate::executor::{BoxFuture, LogLevel, RuntimeOps};
use alloc::sync::Arc;
#[derive(Clone)]
pub struct RuntimeContext {
ops: Arc<dyn RuntimeOps>,
}
impl RuntimeContext {
pub fn new(ops: Arc<dyn RuntimeOps>) -> Self {
Self { ops }
}
pub fn time(&self) -> Time<'_> {
Time { ops: &*self.ops }
}
pub fn log(&self) -> Log<'_> {
Log { ops: &*self.ops }
}
pub fn ops(&self) -> &Arc<dyn RuntimeOps> {
&self.ops
}
}
pub struct Time<'a> {
ops: &'a dyn RuntimeOps,
}
impl Time<'_> {
pub fn now(&self) -> u64 {
self.ops.now_nanos()
}
pub fn unix_time(&self) -> Option<(u64, u32)> {
self.ops.unix_time()
}
pub fn sleep(&self, duration: core::time::Duration) -> BoxFuture {
self.ops.sleep(duration)
}
pub fn sleep_millis(&self, ms: u64) -> BoxFuture {
self.ops.sleep(core::time::Duration::from_millis(ms))
}
pub fn sleep_secs(&self, secs: u64) -> BoxFuture {
self.ops.sleep(core::time::Duration::from_secs(secs))
}
}
pub struct Log<'a> {
ops: &'a dyn RuntimeOps,
}
impl Log<'_> {
pub fn info(&self, message: &str) {
self.ops.log(LogLevel::Info, message)
}
pub fn debug(&self, message: &str) {
self.ops.log(LogLevel::Debug, message)
}
pub fn warn(&self, message: &str) {
self.ops.log(LogLevel::Warn, message)
}
pub fn error(&self, message: &str) {
self.ops.log(LogLevel::Error, message)
}
}