use std::path::{Path, PathBuf};
use super::watch::LogRegistration;
use super::{LogEntry, LogOptions, LogSnapshot, LogStreamOptions};
use crate::MicrosandboxResult;
use crate::backend::sandbox::LogStream;
pub struct SandboxLogger {
name: String,
log_dir: PathBuf,
}
impl SandboxLogger {
pub(crate) fn new(name: String, log_dir: PathBuf) -> Self {
Self { name, log_dir }
}
pub fn name(&self) -> &str {
&self.name
}
pub fn log_dir(&self) -> &Path {
&self.log_dir
}
pub async fn read(&self, opts: &LogOptions) -> MicrosandboxResult<Vec<LogEntry>> {
Ok(self.read_snapshot(opts).await?.entries)
}
pub async fn read_snapshot(&self, opts: &LogOptions) -> MicrosandboxResult<LogSnapshot> {
super::read_logs_snapshot_from_dir(&self.name, self.log_dir.clone(), opts).await
}
pub async fn stream(&self, opts: &LogStreamOptions) -> MicrosandboxResult<LogStream> {
let stream = super::log_stream_from_dir(&self.name, self.log_dir.clone(), opts).await?;
Ok(Box::pin(stream) as LogStream)
}
}
pub struct RegisteredSandboxLogger {
logger: SandboxLogger,
registration: LogRegistration,
}
impl RegisteredSandboxLogger {
pub(crate) fn new(logger: SandboxLogger, registration: LogRegistration) -> Self {
Self {
logger,
registration,
}
}
pub fn name(&self) -> &str {
self.logger.name()
}
pub fn log_dir(&self) -> &Path {
self.logger.log_dir()
}
pub async fn read(&self, opts: &LogOptions) -> MicrosandboxResult<Vec<LogEntry>> {
self.logger.read(opts).await
}
pub async fn read_snapshot(&self, opts: &LogOptions) -> MicrosandboxResult<LogSnapshot> {
self.logger.read_snapshot(opts).await
}
pub async fn stream(&self, opts: &LogStreamOptions) -> MicrosandboxResult<LogStream> {
if !opts.follow {
return self.logger.stream(opts).await;
}
let subscription = self.registration.subscribe();
let stream = super::log_stream_from_dir_registry(
&self.logger.name,
self.logger.log_dir.clone(),
opts,
subscription,
)
.await?;
Ok(Box::pin(stream) as LogStream)
}
}