use std::{net::IpAddr, str::FromStr};
use debug::LogStrategy;
use dispatcher::WeightedAddress;
use eyre::Result;
use structopt::StructOpt;
mod debug;
mod dispatcher;
mod list;
mod net;
mod server;
mod socks;
#[derive(Debug, StructOpt)]
struct Opt {
#[structopt(short, long)]
debug: bool,
#[structopt(subcommand)]
command: Command,
}
#[derive(Debug, StructOpt)]
enum Command {
List,
Start {
#[structopt(default_value = "127.0.0.1", long)]
ip: IpAddr,
#[structopt(default_value = "1080", long)]
port: u16,
#[structopt(required = true, parse(try_from_str = WeightedAddress::from_str))]
addresses: Vec<WeightedAddress>,
},
}
fn main() -> Result<()> {
let opt = Opt::from_args();
let _guard = debug::install(if opt.debug {
LogStrategy::Stdout
} else {
LogStrategy::File
})?;
match opt.command {
Command::List => list::list(),
Command::Start {
ip,
port,
addresses,
} => server::server(ip, port, addresses)?,
}
Ok(())
}