@@ -7,11 +7,11 @@ mod streams;
77
88use clap:: { parser:: ValueSource , ArgGroup , CommandFactory , FromArgMatches , Parser } ;
99use slipstream_core:: {
10+ cli:: { exit_with_error, exit_with_message, init_logging, unwrap_or_exit} ,
1011 normalize_domain, parse_host_port, parse_host_port_parts, sip003, AddressKind , HostPort ,
1112} ;
1213use slipstream_ffi:: { ClientConfig , ResolverMode , ResolverSpec } ;
1314use tokio:: runtime:: Builder ;
14- use tracing_subscriber:: EnvFilter ;
1515
1616use runtime:: run_client;
1717
@@ -64,96 +64,89 @@ fn main() {
6464 init_logging ( ) ;
6565 let matches = Args :: command ( ) . get_matches ( ) ;
6666 let args = Args :: from_arg_matches ( & matches) . unwrap_or_else ( |err| err. exit ( ) ) ;
67- let sip003_env = sip003:: read_sip003_env ( ) . unwrap_or_else ( |err| {
68- tracing:: error!( "SIP003 env error: {}" , err) ;
69- std:: process:: exit ( 2 ) ;
70- } ) ;
67+ let sip003_env = unwrap_or_exit ( sip003:: read_sip003_env ( ) , "SIP003 env error" , 2 ) ;
7168 if sip003_env. is_present ( ) {
7269 tracing:: info!( "SIP003 env detected; applying SS_* overrides with CLI precedence" ) ;
7370 }
7471
7572 let tcp_listen_host_provided = cli_provided ( & matches, "tcp_listen_host" ) ;
7673 let tcp_listen_port_provided = cli_provided ( & matches, "tcp_listen_port" ) ;
77- let ( tcp_listen_host, tcp_listen_port) = sip003 :: select_host_port (
78- & args . tcp_listen_host ,
79- args. tcp_listen_port ,
80- tcp_listen_host_provided ,
81- tcp_listen_port_provided ,
82- sip003_env . local_host . as_deref ( ) ,
83- sip003_env. local_port . as_deref ( ) ,
84- "SS_LOCAL" ,
85- )
86- . unwrap_or_else ( |err| {
87- tracing :: error! ( "SIP003 env error: {}" , err ) ;
88- std :: process :: exit ( 2 ) ;
89- } ) ;
74+ let ( tcp_listen_host, tcp_listen_port) = unwrap_or_exit (
75+ sip003 :: select_host_port (
76+ & args. tcp_listen_host ,
77+ args . tcp_listen_port ,
78+ tcp_listen_host_provided ,
79+ tcp_listen_port_provided ,
80+ sip003_env. local_host . as_deref ( ) ,
81+ sip003_env . local_port . as_deref ( ) ,
82+ "SS_LOCAL" ,
83+ ) ,
84+ "SIP003 env error" ,
85+ 2 ,
86+ ) ;
9087
9188 let domain = if let Some ( domain) = args. domain . clone ( ) {
9289 domain
9390 } else {
94- let option_domain = parse_domain_option ( & sip003_env. plugin_options ) . unwrap_or_else ( |err| {
95- tracing:: error!( "SIP003 env error: {}" , err) ;
96- std:: process:: exit ( 2 ) ;
97- } ) ;
91+ let option_domain = unwrap_or_exit (
92+ parse_domain_option ( & sip003_env. plugin_options ) ,
93+ "SIP003 env error" ,
94+ 2 ,
95+ ) ;
9896 if let Some ( domain) = option_domain {
9997 domain
10098 } else {
101- tracing:: error!( "A domain is required" ) ;
102- std:: process:: exit ( 2 ) ;
99+ exit_with_message ( "A domain is required" , 2 ) ;
103100 }
104101 } ;
105102
106103 let cli_has_resolvers = has_cli_resolvers ( & matches) ;
107104 let resolvers = if cli_has_resolvers {
108- build_resolvers ( & matches, true ) . unwrap_or_else ( |err| {
109- tracing:: error!( "Resolver error: {}" , err) ;
110- std:: process:: exit ( 2 ) ;
111- } )
105+ unwrap_or_exit ( build_resolvers ( & matches, true ) , "Resolver error" , 2 )
112106 } else {
113- let resolver_options = parse_resolvers_from_options ( & sip003_env . plugin_options )
114- . unwrap_or_else ( |err| {
115- tracing :: error! ( "SIP003 env error: {}" , err ) ;
116- std :: process :: exit ( 2 ) ;
117- } ) ;
107+ let resolver_options = unwrap_or_exit (
108+ parse_resolvers_from_options ( & sip003_env . plugin_options ) ,
109+ "SIP003 env error" ,
110+ 2 ,
111+ ) ;
118112 if !resolver_options. resolvers . is_empty ( ) {
119113 resolver_options. resolvers
120114 } else {
121- let sip003_remote = sip003 :: parse_endpoint (
122- sip003_env . remote_host . as_deref ( ) ,
123- sip003_env. remote_port . as_deref ( ) ,
124- "SS_REMOTE" ,
125- )
126- . unwrap_or_else ( |err| {
127- tracing :: error! ( "SIP003 env error: {}" , err ) ;
128- std :: process :: exit ( 2 ) ;
129- } ) ;
115+ let sip003_remote = unwrap_or_exit (
116+ sip003 :: parse_endpoint (
117+ sip003_env. remote_host . as_deref ( ) ,
118+ sip003_env . remote_port . as_deref ( ) ,
119+ "SS_REMOTE" ,
120+ ) ,
121+ "SIP003 env error" ,
122+ 2 ,
123+ ) ;
130124 if let Some ( endpoint) = & sip003_remote {
131125 let mode = if resolver_options. authoritative_remote {
132126 ResolverMode :: Authoritative
133127 } else {
134128 ResolverMode :: Recursive
135129 } ;
136- let resolver =
137- parse_host_port_parts ( & endpoint. host , endpoint. port , AddressKind :: Resolver )
138- . unwrap_or_else ( |err| {
139- tracing:: error!( "SIP003 env error: {}" , err) ;
140- std:: process:: exit ( 2 ) ;
141- } ) ;
130+ let resolver = unwrap_or_exit (
131+ parse_host_port_parts ( & endpoint. host , endpoint. port , AddressKind :: Resolver ) ,
132+ "SIP003 env error" ,
133+ 2 ,
134+ ) ;
142135 vec ! [ ResolverSpec { resolver, mode } ]
143136 } else {
144- tracing:: error!( "At least one resolver is required" ) ;
145- std:: process:: exit ( 2 ) ;
137+ exit_with_message ( "At least one resolver is required" , 2 ) ;
146138 }
147139 }
148140 } ;
149141
150142 let congestion_control = if args. congestion_control . is_some ( ) {
151143 args. congestion_control . clone ( )
152144 } else {
153- parse_congestion_control ( & sip003_env. plugin_options ) . unwrap_or_else ( |err| {
154- tracing:: error!( "SIP003 env error: {}" , err) ;
155- std:: process:: exit ( 2 ) ;
156- } )
145+ unwrap_or_exit (
146+ parse_congestion_control ( & sip003_env. plugin_options ) ,
147+ "SIP003 env error" ,
148+ 2 ,
149+ )
157150 } ;
158151
159152 let cert = if args. cert . is_some ( ) {
@@ -170,11 +163,11 @@ fn main() {
170163 let keep_alive_interval = if cli_provided ( & matches, "keep_alive_interval" ) {
171164 args. keep_alive_interval
172165 } else {
173- let keep_alive_override = parse_keep_alive_interval ( & sip003_env . plugin_options )
174- . unwrap_or_else ( |err| {
175- tracing :: error! ( "SIP003 env error: {}" , err ) ;
176- std :: process :: exit ( 2 ) ;
177- } ) ;
166+ let keep_alive_override = unwrap_or_exit (
167+ parse_keep_alive_interval ( & sip003_env . plugin_options ) ,
168+ "SIP003 env error" ,
169+ 2 ,
170+ ) ;
178171 keep_alive_override. unwrap_or ( args. keep_alive_interval )
179172 } ;
180173
@@ -198,22 +191,10 @@ fn main() {
198191 . expect ( "Failed to build Tokio runtime" ) ;
199192 match runtime. block_on ( run_client ( & config) ) {
200193 Ok ( code) => std:: process:: exit ( code) ,
201- Err ( err) => {
202- tracing:: error!( "Client error: {}" , err) ;
203- std:: process:: exit ( 1 ) ;
204- }
194+ Err ( err) => exit_with_error ( "Client error" , err, 1 ) ,
205195 }
206196}
207197
208- fn init_logging ( ) {
209- let filter = EnvFilter :: try_from_default_env ( ) . unwrap_or_else ( |_| EnvFilter :: new ( "info" ) ) ;
210- let _ = tracing_subscriber:: fmt ( )
211- . with_env_filter ( filter)
212- . with_target ( false )
213- . without_time ( )
214- . try_init ( ) ;
215- }
216-
217198fn parse_domain ( input : & str ) -> Result < String , String > {
218199 normalize_domain ( input) . map_err ( |err| err. to_string ( ) )
219200}
0 commit comments