@@ -16,7 +16,7 @@ mod utils;
16
16
mod webview;
17
17
18
18
use std:: path:: Path ;
19
- use std:: process:: exit ;
19
+ use std:: process:: ExitCode ;
20
20
use std:: sync:: {
21
21
Arc ,
22
22
RwLock ,
@@ -84,7 +84,7 @@ pub type EventLoopProxy = WryEventLoopProxy<Event>;
84
84
pub type EventLoopWindowTarget = WryEventLoopWindowTarget < Event > ;
85
85
86
86
#[ tokio:: main]
87
- async fn main ( ) {
87
+ async fn main ( ) -> ExitCode {
88
88
let cli = cli:: Cli :: parse ( ) ;
89
89
90
90
let _log_guard = initialize_logging ( LogArgs {
@@ -109,33 +109,13 @@ async fn main() {
109
109
}
110
110
111
111
if cli. is_startup && !fig_settings:: settings:: get_bool_or ( "app.launchOnStartup" , true ) {
112
- std :: process :: exit ( 0 ) ;
112
+ return ExitCode :: SUCCESS ;
113
113
}
114
114
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
+ } ;
139
119
140
120
if !cli. allow_multiple {
141
121
match get_current_pid ( ) {
@@ -157,22 +137,11 @@ async fn main() {
157
137
)
158
138
. show ( ) ;
159
139
160
- return ;
140
+ return ExitCode :: FAILURE ;
161
141
}
162
142
}
163
143
}
164
144
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
-
176
145
let ctx = Context :: new ( ) ;
177
146
install:: run_install ( Arc :: clone ( & ctx) , cli. ignore_immediate_update ) . await ;
178
147
@@ -226,18 +195,49 @@ async fn main() {
226
195
227
196
webview_manager. run ( ) . await . unwrap ( ) ;
228
197
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
+ } ) )
229
226
}
230
227
231
228
#[ 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 > {
233
234
use std:: ffi:: OsString ;
234
235
235
236
use tracing:: debug;
236
237
237
238
if kill_old {
238
239
eprintln ! ( "Option kill-old is not supported on Linux." ) ;
239
- #[ allow( clippy:: exit) ]
240
- exit ( 0 ) ;
240
+ return Some ( ExitCode :: SUCCESS ) ;
241
241
}
242
242
243
243
let system = System :: new_with_specifics (
@@ -278,16 +278,20 @@ async fn allow_multiple_running_check(current_pid: sysinfo::Pid, kill_old: bool,
278
278
eprintln ! ( "Failed to open Fig: {err}" ) ;
279
279
}
280
280
281
- #[ allow( clippy:: exit) ]
282
- exit ( 0 ) ;
281
+ return Some ( ExitCode :: SUCCESS ) ;
283
282
} ,
284
283
_ => ( ) ,
285
284
}
286
285
}
286
+ None
287
287
}
288
288
289
289
#[ 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 > {
291
295
use std:: ffi:: OsString ;
292
296
293
297
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,
341
345
{
342
346
eprintln ! ( "Failed to open Fig: {err}" ) ;
343
347
}
344
-
345
- #[ allow( clippy:: exit) ]
346
- exit ( 0 ) ;
347
348
} ;
348
349
349
350
match ( process. user_id ( ) . map ( |uid| uid as & u32 ) , current_user_id. as_ref ( ) ) {
350
351
( Some ( uid) , Some ( current_uid) ) if uid == current_uid => {
351
352
on_match. await ;
353
+ return Some ( ExitCode :: SUCCESS ) ;
352
354
} ,
353
355
( _, None ) => {
354
356
on_match. await ;
357
+ return Some ( ExitCode :: SUCCESS ) ;
355
358
} ,
356
359
_ => { } ,
357
360
}
358
361
}
359
362
}
360
363
}
364
+ None
361
365
}
0 commit comments