httproxide 0.2.0

Rusted HTTP router reverse-proxy
Documentation
use serde::{Deserialize, Serialize};
use serde_yaml::Value;

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct Config {
    pub listeners: Vec<ListenerAndTargetConfig>,
}

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct ListenerAndTargetConfig {
    #[serde(flatten)]
    pub target: TargetConfig,
    #[serde(flatten)]
    pub listener: Value,
}

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct TargetConfig {
    #[serde(flatten)]
    pub service: Value,
    #[serde(default)]
    pub layers: Vec<Value>,
}

fn usage(program: &str) -> ! {
    eprintln!("usage: {} <CONFIG>", program);
    std::process::exit(1)
}

pub fn path_from_args() -> String {
    let mut args = std::env::args();
    let program = args.next().unwrap();
    let config_path = match args.next() {
        Some(v) => v,
        _ => usage(&program),
    };
    if args.next().is_some() {
        usage(&program);
    }
    config_path
}