WIP: I'm lost with Boxes and opaque types
Some checks failed
continuous-integration/drone/pr Build is failing

This commit is contained in:
adrien 2021-09-22 15:52:50 +02:00
parent 006f84e3b0
commit a464aabe25

View file

@ -1,4 +1,7 @@
use std::pin::Pin;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use futures::future::{try_join_all, Future};
use tokio::try_join; use tokio::try_join;
use crate::{ use crate::{
@ -6,10 +9,7 @@ use crate::{
}; };
pub struct Diplonat { pub struct Diplonat {
consul: ConsulActor, actors: Vec<Pin<Box<dyn Future<Output = Result<()>>>>>,
firewall: Option<FirewallActor>,
igd: Option<IgdActor>,
} }
impl Diplonat { impl Diplonat {
@ -18,46 +18,26 @@ impl Diplonat {
println!("{:#?}", config); println!("{:#?}", config);
let consul_actor = ConsulActor::new(config.consul); let consul_actor = ConsulActor::new(config.consul);
let mut actors = vec![Box::pin(consul_actor.listen())];
let firewall_actor = FirewallActor::new(config.firewall, &consul_actor.rx_open_ports)?; if let Some(actor) = FirewallActor::new(config.firewall, &consul_actor.rx_open_ports)? {
actors.push(Box::pin(actor.listen()));
}
if let Some(actor) = IgdActor::new(config.igd, &consul_actor.rx_open_ports).await? {
actors.push(Box::pin(actor.listen()));
}
let igd_actor = IgdActor::new(config.igd, &consul_actor.rx_open_ports).await?; if actors.len() == 1 {
if firewall_actor.is_none() && igd_actor.is_none() {
return Err(anyhow!( return Err(anyhow!(
"At least enable *one* module, otherwise it's boring!" "At least enable *one* module, otherwise it's boring!"
)) ))
} }
let ctx = Self { Ok(Self { actors })
consul: consul_actor,
firewall: firewall_actor,
igd: igd_actor,
};
return Ok(ctx)
} }
pub async fn listen(&mut self) -> Result<()> { pub async fn listen(&self) -> Result<()> {
let firewall = &mut self.firewall; try_join_all(self.actors);
let igd = &mut self.igd; Ok(())
try_join!(
self.consul.listen(),
async {
match firewall {
Some(x) => x.listen().await,
None => Ok(()),
}
},
async {
match igd {
Some(x) => x.listen().await,
None => Ok(()),
}
},
)?;
return Ok(())
} }
} }