use anyhow::{Result, Context}; use tokio::sync::broadcast; use futures::future::try_join_all; use log::*; use std::cell::Cell; use crate::environment_adapter::*; use crate::igd_adapter::*; use crate::node_state::*; pub struct Diplonat<'a> { pub notif: broadcast::Sender<()>, pub state: Cell, env: EnvironmentAdapter, igd: IgdAdapter<'a>, } impl<'a> Diplonat<'a> { pub async fn new() -> Result> { let (tx, _) = broadcast::channel(1); let ns = Cell::new(NodeState::new()); // we deliberately choose to init one after another let ctx = Diplonat { notif: tx, state: ns, env: EnvironmentAdapter::new(&ns, &tx).await?, igd: IgdAdapter::new(&ns, &tx).await? }; info!("Consul URL: {:#?}", ns.consul_url); info!("Consul node name: {:#?}", ns.consul_node_name); info!("Private IP address: {:#?}", ns.private_ip); info!("Refresh time: {:#?} seconds", ns.refresh_time); info!("Expiration time: {:#?} seconds", ns.expiration_time); return Ok(ctx); } pub async fn listen(&self) -> Result<()> { return Ok(()); } }