use crate::Result;
use crate::daemon_id::DaemonId;
use chrono::{DateTime, Local};
#[derive(Debug, Clone)]
pub struct LogEntry {
pub id: i64,
pub daemon_id: String,
pub timestamp: DateTime<Local>,
pub message: String,
}
#[derive(Debug, Clone, Default)]
pub struct LogQuery {
pub daemon_ids: Vec<String>,
pub from: Option<DateTime<Local>>,
pub to: Option<DateTime<Local>>,
pub limit: Option<usize>,
pub order_desc: bool,
pub after_id: Option<i64>,
}
#[derive(Debug, Clone, Copy)]
pub struct RetentionPolicy {
pub age: Option<chrono::Duration>,
pub count: Option<u64>,
}
impl RetentionPolicy {
#[allow(dead_code)]
pub fn is_none(&self) -> bool {
self.age.is_none() && self.count.is_none()
}
}
pub trait LogStore: Send + Sync {
fn append(&self, daemon_id: &DaemonId, message: &str) -> Result<()>;
fn query(&self, opts: &LogQuery) -> Result<Vec<LogEntry>>;
fn tail(&self, daemon_id: &DaemonId, after_id: Option<i64>) -> Result<Vec<LogEntry>>;
fn clear(&self, daemon_ids: &[DaemonId]) -> Result<()>;
fn apply_retention(
&self,
policy: &RetentionPolicy,
excluded_daemon_ids: &[DaemonId],
) -> Result<u64> {
let _ = (policy, excluded_daemon_ids);
Ok(0)
}
fn apply_retention_for_daemon(
&self,
daemon_id: &DaemonId,
policy: &RetentionPolicy,
) -> Result<u64> {
let _ = (daemon_id, policy);
Ok(0)
}
fn list_daemon_ids(&self) -> Result<Vec<String>>;
fn last_clear_generation(&self, daemon_id: &DaemonId) -> Result<Option<u64>> {
let _ = daemon_id;
Ok(None)
}
}
pub mod sqlite;