@@ -16,7 +16,7 @@ mod utils;
1616mod webview;
1717
1818use std:: path:: Path ;
19- use std:: process:: exit ;
19+ use std:: process:: ExitCode ;
2020use std:: sync:: {
2121 Arc ,
2222 RwLock ,
@@ -84,7 +84,7 @@ pub type EventLoopProxy = WryEventLoopProxy<Event>;
8484pub type EventLoopWindowTarget = WryEventLoopWindowTarget < Event > ;
8585
8686#[ tokio:: main]
87- async fn main ( ) {
87+ async fn main ( ) -> ExitCode {
8888 let cli = cli:: Cli :: parse ( ) ;
8989
9090 let _log_guard = initialize_logging ( LogArgs {
@@ -109,33 +109,13 @@ async fn main() {
109109 }
110110
111111 if cli. is_startup && !fig_settings:: settings:: get_bool_or ( "app.launchOnStartup" , true ) {
112- std :: process :: exit ( 0 ) ;
112+ return ExitCode :: SUCCESS ;
113113 }
114114
115- let page = cli
116- . url_link
117- . as_ref ( )
118- . and_then ( |url| match Url :: parse ( url) {
119- Ok ( url) => Some ( url) ,
120- Err ( err) => {
121- error ! ( %err, %url, "Failed to parse url" ) ;
122- exit ( 1 )
123- } ,
124- } )
125- . and_then ( |url| {
126- if url. scheme ( ) != URL_SCHEMA {
127- error ! ( scheme = %url. scheme( ) , %url, "Invalid scheme" ) ;
128- exit ( 1 )
129- }
130-
131- url. host_str ( ) . and_then ( |s| match s {
132- "dashboard" => Some ( url. path ( ) . to_owned ( ) ) ,
133- _ => {
134- error ! ( "Invalid deep link" ) ;
135- None
136- } ,
137- } )
138- } ) ;
115+ let page = match parse_url_page ( cli. url_link . as_deref ( ) ) {
116+ Ok ( page) => page,
117+ Err ( exit_code) => return exit_code,
118+ } ;
139119
140120 if !cli. allow_multiple {
141121 match get_current_pid ( ) {
@@ -157,22 +137,11 @@ async fn main() {
157137 )
158138 . show ( ) ;
159139
160- return ;
140+ return ExitCode :: FAILURE ;
161141 }
162142 }
163143 }
164144
165- // tokio::spawn(async {
166- // fig_telemetry::emit_track(fig_telemetry::TrackEvent::new(
167- // fig_telemetry::TrackEventType::LaunchedApp,
168- // fig_telemetry::TrackSource::Desktop,
169- // env!("CARGO_PKG_VERSION").into(),
170- // empty::<(&str, &str)>(),
171- // ))
172- // .await
173- // .ok();
174- // });
175-
176145 let ctx = Context :: new ( ) ;
177146 install:: run_install ( Arc :: clone ( & ctx) , cli. ignore_immediate_update ) . await ;
178147
@@ -226,18 +195,49 @@ async fn main() {
226195
227196 webview_manager. run ( ) . await . unwrap ( ) ;
228197 fig_telemetry:: finish_telemetry ( ) . await ;
198+ ExitCode :: SUCCESS
199+ }
200+
201+ fn parse_url_page ( url : Option < & str > ) -> Result < Option < String > , ExitCode > {
202+ let Some ( url) = url else {
203+ return Ok ( None ) ;
204+ } ;
205+
206+ let url = match Url :: parse ( url) {
207+ Ok ( url) => url,
208+ Err ( err) => {
209+ error ! ( %err, %url, "Failed to parse url" ) ;
210+ return Err ( ExitCode :: FAILURE ) ;
211+ } ,
212+ } ;
213+
214+ if url. scheme ( ) != URL_SCHEMA {
215+ error ! ( scheme = %url. scheme( ) , %url, "Invalid scheme" ) ;
216+ return Err ( ExitCode :: FAILURE ) ;
217+ }
218+
219+ Ok ( url. host_str ( ) . and_then ( |s| match s {
220+ "dashboard" => Some ( url. path ( ) . to_owned ( ) ) ,
221+ _ => {
222+ error ! ( "Invalid deep link" ) ;
223+ None
224+ } ,
225+ } ) )
229226}
230227
231228#[ cfg( target_os = "linux" ) ]
232- async fn allow_multiple_running_check ( current_pid : sysinfo:: Pid , kill_old : bool , page : Option < String > ) {
229+ async fn allow_multiple_running_check (
230+ current_pid : sysinfo:: Pid ,
231+ kill_old : bool ,
232+ page : Option < String > ,
233+ ) -> Option < ExitCode > {
233234 use std:: ffi:: OsString ;
234235
235236 use tracing:: debug;
236237
237238 if kill_old {
238239 eprintln ! ( "Option kill-old is not supported on Linux." ) ;
239- #[ allow( clippy:: exit) ]
240- exit ( 0 ) ;
240+ return Some ( ExitCode :: SUCCESS ) ;
241241 }
242242
243243 let system = System :: new_with_specifics (
@@ -278,16 +278,20 @@ async fn allow_multiple_running_check(current_pid: sysinfo::Pid, kill_old: bool,
278278 eprintln ! ( "Failed to open Fig: {err}" ) ;
279279 }
280280
281- #[ allow( clippy:: exit) ]
282- exit ( 0 ) ;
281+ return Some ( ExitCode :: SUCCESS ) ;
283282 } ,
284283 _ => ( ) ,
285284 }
286285 }
286+ None
287287}
288288
289289#[ cfg( target_os = "macos" ) ]
290- async fn allow_multiple_running_check ( current_pid : sysinfo:: Pid , kill_old : bool , page : Option < String > ) {
290+ async fn allow_multiple_running_check (
291+ current_pid : sysinfo:: Pid ,
292+ kill_old : bool ,
293+ page : Option < String > ,
294+ ) -> Option < ExitCode > {
291295 use std:: ffi:: OsString ;
292296
293297 let app_process_name = OsString :: from ( APP_PROCESS_NAME ) ;
@@ -341,21 +345,21 @@ async fn allow_multiple_running_check(current_pid: sysinfo::Pid, kill_old: bool,
341345 {
342346 eprintln ! ( "Failed to open Fig: {err}" ) ;
343347 }
344-
345- #[ allow( clippy:: exit) ]
346- exit ( 0 ) ;
347348 } ;
348349
349350 match ( process. user_id ( ) . map ( |uid| uid as & u32 ) , current_user_id. as_ref ( ) ) {
350351 ( Some ( uid) , Some ( current_uid) ) if uid == current_uid => {
351352 on_match. await ;
353+ return Some ( ExitCode :: SUCCESS ) ;
352354 } ,
353355 ( _, None ) => {
354356 on_match. await ;
357+ return Some ( ExitCode :: SUCCESS ) ;
355358 } ,
356359 _ => { } ,
357360 }
358361 }
359362 }
360363 }
364+ None
361365}
0 commit comments