use std::sync::Arc;
use std::time::Duration;
use futures_util::future::BoxFuture;
use microvms_app::adapters::Adapters;
use microvms_app::clock::Clock;
use microvms_app::control::BuildServices;
use microvms_app::error::Error;
use microvms_app::region::Region;
use microvms_app::session::SharedBackend;
use crate::clock::TokioClock;
use crate::control::services::SignedBuildServices;
use crate::session::http::ReqwestBackend;
#[derive(Clone, Copy, Debug, Default)]
pub struct SystemAdapters;
impl Adapters for SystemAdapters {
fn http_backend(&self, endpoint: &str, timeout: Duration) -> Result<SharedBackend, Error> {
Ok(Arc::new(ReqwestBackend::new(endpoint, timeout)?))
}
fn build_services(
&self,
region: Region,
) -> BoxFuture<'_, Result<Arc<dyn BuildServices>, Error>> {
Box::pin(async move {
Ok(Arc::new(SignedBuildServices::new(region).await?) as Arc<dyn BuildServices>)
})
}
fn clock(&self) -> Arc<dyn Clock> {
Arc::new(TokioClock::new())
}
fn warn(&self, warning: &str) {
use std::io::Write as _;
let _ = writeln!(std::io::stderr(), "{warning}");
}
}