use anyhow::Result; use log::*; use tokio::{ select, sync::watch, time::{self, Duration}, }; use crate::config::RuntimeConfigAcme; use crate::messages; pub struct AcmeActor { email: String, //last_ports: messages::PublicExposedPorts, refresh: Duration, rx_ports: watch::Receiver, } impl AcmeActor { pub async fn new( config: Option, rxp: &watch::Receiver, ) -> Result> { if config.is_none() { return Ok(None); } let config = config.unwrap(); let ctx = Self { email: config.email, //last_ports: messages::PublicExposedPorts::new(), refresh: config.refresh_time, rx_ports: rxp.clone(), }; Ok(Some(ctx)) } pub async fn listen(&mut self) -> Result<()> { let mut interval = time::interval(self.refresh); loop { select! { Some(ports) = self.rx_ports.recv() => { match self.do_acme(ports).await { Ok(()) => debug!("Successfully updated ACME"), Err(e) => error!("An error occured while updating ACME. {}", e), } }, _ = interval.tick() => continue, else => break // Sender dropped, terminate loop. } } Ok(()) } pub async fn do_acme(&self, ports: messages::PublicExposedPorts) -> Result<()> { if ports.acme.is_empty() { return Ok(()); } let primary_url = &ports.acme[0]; let secondary_urls = &ports.acme[1..]; println!("Doing ACME!!!"); println!("Primary URL: {:?}", primary_url); println!("Secondary URLs: {:?}", secondary_urls); Ok(()) } }