kaminari_cmd/
lib.rs

1use std::env;
2use std::net::{SocketAddr, ToSocketAddrs};
3use anyhow::Result;
4
5pub struct Endpoint {
6    pub local: SocketAddr,
7    pub remote: SocketAddr,
8}
9
10pub fn parse_env() -> Result<(Endpoint, String)> {
11    let local_host = env::var("SS_LOCAL_HOST")?;
12    let local_port = env::var("SS_LOCAL_PORT")?;
13    let remote_host = env::var("SS_REMOTE_HOST")?;
14    let remote_port = env::var("SS_REMOTE_PORT")?;
15    let plugin_opts = env::var("SS_PLUGIN_OPTIONS")?;
16
17    let local = format!("{}:{}", local_host, local_port)
18        .to_socket_addrs()?
19        .next()
20        .unwrap();
21
22    let remote = format!("{}:{}", remote_host, remote_port)
23        .to_socket_addrs()?
24        .next()
25        .unwrap();
26
27    Ok((Endpoint { local, remote }, plugin_opts))
28}
29
30pub fn parse_cmd() -> Result<(Endpoint, String)> {
31    let args: Vec<String> = env::args().collect();
32
33    anyhow::ensure!(args.len() == 4, "usage: <local> <remote> <options>");
34
35    let local = args[1].to_socket_addrs()?.next().unwrap();
36    let remote = args[2].to_socket_addrs()?.next().unwrap();
37    let plugin_opts = args[3].clone();
38
39    Ok((Endpoint { local, remote }, plugin_opts))
40}