aboutsummaryrefslogblamecommitdiff
path: root/src/environment_adapter.rs
blob: e4fad70a3e0c0b5732d8ba6b63643a1b03f5743a (plain) (tree)

















































                                                                                                                                                      
use std::env;
use tokio::sync::broadcast;
use anyhow::{Result, Context, anyhow};
use log::*;
use crate::diplonat::*;
use crate::node_state::*;
use std::cell::Cell;

const epi: &'static str = "DIPLONAT_PRIVATE_IP";
const ert: &'static str = "DIPLONAT_REFRESH_TIME";
const eet: &'static str = "DIPLONAT_EXPIRATION_TIME";
const ecnd: &'static str = "DIPLONAT_CONSUL_NODE_NAME";
const ecu: &'static str = "DIPLONAT_CONSUL_URL";

pub struct EnvironmentAdapter {}

impl EnvironmentAdapter {
  pub async fn new(ns: &Cell<NodeState>, _: &broadcast::Sender<()>) -> Result<Self> {
    ns.consul_node_name = Some(match env::var(ecu) { 
      Ok(e) => e, 
      Err(_) => "http://127.0.0.1:8500".to_string() 
    });

    ns.private_ip = Some(env::var(epi)
      .with_context(|| format!("{} env var must be defined, eg: 192.168.0.18", epi))?);

    ns.refresh_time = Some(env::var(ert)
      .with_context(|| format!("{} env var must be defined, eg: 60", ert))?
      .parse()
      .with_context(|| format!("{} env var must be an integer, eg: 60", ert))?);

    ns.expiration_time = Some(env::var(eet)
      .with_context(|| format!("{} env var must be defined, eg: 300", eet))?
      .parse()
      .with_context(|| format!("{} env var must be an integer, eg: 300", eet))?);

    ns.consul_node_name = Some(env::var(ecnd)
      .with_context(|| format!("{} env var must be defined", ecnd))?);

    match (ns.refresh_time, ns.expiration_time) {
      (Some(rt), Some(et)) if rt * 2 <= et => debug!("Checked refresh time is lower than expiration time"),
      (Some(rt), Some(et)) => return Err(anyhow!("Expiration time (currently: {}s) must be twice bigger than refresh time (currently: {}s)", rt, et)),
      _ => return Err(anyhow!("Please define refresh time and expiration time"))
    }

    return Ok(Self{});
  }
}