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}