forked from Deuxfleurs/diplonat
WIP: I'm lost with Boxes and opaque types
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
006f84e3b0
commit
a464aabe25
1 changed files with 16 additions and 36 deletions
|
@ -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(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue