use std::rc::Rc;
use crate::CronError;
use crate::CronHandle;
use crate::CronHandler;
use crate::CronSpec;
use crate::local::LocalCronHandler;
use crate::socket::SocketCronHandler;
pub enum CronHandlerImpl {
Local(LocalCronHandler),
Socket(SocketCronHandler),
}
impl CronHandlerImpl {
pub fn create_from_env() -> Self {
match std::env::var("DENO_UNSTABLE_CRON_SOCK") {
Ok(socket_addr) => Self::Socket(SocketCronHandler::new(socket_addr)),
Err(_) => Self::Local(LocalCronHandler::new()),
}
}
}
impl CronHandler for CronHandlerImpl {
fn create(&self, spec: CronSpec) -> Result<Rc<dyn CronHandle>, CronError> {
match self {
Self::Local(h) => h.create(spec),
Self::Socket(h) => h.create(spec),
}
}
fn maybe_reload(&self) -> Option<Box<dyn CronHandler>> {
let current_sock = std::env::var("DENO_UNSTABLE_CRON_SOCK").ok();
match (self, current_sock) {
(Self::Local(_), Some(new_addr)) => {
Some(Box::new(Self::Socket(SocketCronHandler::new(new_addr))))
}
(Self::Socket(handler), Some(new_addr)) => {
if handler.socket_addr() != new_addr {
Some(Box::new(Self::Socket(SocketCronHandler::new(new_addr))))
} else {
None
}
}
(Self::Socket(_), None) => None,
(Self::Local(_), None) => None,
}
}
}