@@ -18,6 +18,9 @@ use std::fs::File;
18
18
use std:: io:: { BufRead , BufReader } ;
19
19
use std:: path:: PathBuf ;
20
20
use uucore:: display:: Quotable ;
21
+ #[ cfg( not( any( target_os = "macos" , target_os = "redox" ) ) ) ]
22
+ use uucore:: error:: FromIo ;
23
+ use uucore:: error:: { UResult , USimpleError } ;
21
24
use uucore:: show_error;
22
25
#[ cfg( windows) ]
23
26
use winapi:: {
@@ -137,7 +140,8 @@ impl<'a> From<&'a str> for Rfc3339Format {
137
140
}
138
141
}
139
142
140
- pub fn uumain ( args : impl uucore:: Args ) -> i32 {
143
+ #[ uucore_procs:: gen_uumain]
144
+ pub fn uumain ( args : impl uucore:: Args ) -> UResult < ( ) > {
141
145
let syntax = format ! (
142
146
"{0} [OPTION]... [+FORMAT]...
143
147
{0} [OPTION]... [MMDDhhmm[[CC]YY][.ss]]" ,
@@ -147,8 +151,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
147
151
148
152
let format = if let Some ( form) = matches. value_of ( OPT_FORMAT ) {
149
153
if !form. starts_with ( '+' ) {
150
- show_error ! ( "invalid date {}" , form. quote( ) ) ;
151
- return 1 ;
154
+ return Err ( USimpleError :: new (
155
+ 1 ,
156
+ format ! ( "invalid date {}" , form. quote( ) ) ,
157
+ ) ) ;
152
158
}
153
159
let form = form[ 1 ..] . to_string ( ) ;
154
160
Format :: Custom ( form)
@@ -176,8 +182,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
176
182
let set_to = match matches. value_of ( OPT_SET ) . map ( parse_date) {
177
183
None => None ,
178
184
Some ( Err ( ( input, _err) ) ) => {
179
- show_error ! ( "invalid date {}" , input. quote( ) ) ;
180
- return 1 ;
185
+ return Err ( USimpleError :: new (
186
+ 1 ,
187
+ format ! ( "invalid date {}" , input. quote( ) ) ,
188
+ ) ) ;
181
189
}
182
190
Some ( Ok ( date) ) => Some ( date) ,
183
191
} ;
@@ -241,14 +249,12 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
241
249
let formatted = date. format ( format_string) . to_string ( ) . replace ( "%f" , "%N" ) ;
242
250
println ! ( "{}" , formatted) ;
243
251
}
244
- Err ( ( input, _err) ) => {
245
- show_error ! ( "invalid date {}" , input. quote( ) ) ;
246
- }
252
+ Err ( ( input, _err) ) => show_error ! ( "invalid date {}" , input. quote( ) ) ,
247
253
}
248
254
}
249
255
}
250
256
251
- 0
257
+ Ok ( ( ) )
252
258
}
253
259
254
260
pub fn uu_app ( ) -> App < ' static , ' static > {
@@ -348,20 +354,24 @@ fn parse_date<S: AsRef<str> + Clone>(
348
354
}
349
355
350
356
#[ cfg( not( any( unix, windows) ) ) ]
351
- fn set_system_datetime ( _date : DateTime < Utc > ) -> i32 {
357
+ fn set_system_datetime ( _date : DateTime < Utc > ) -> UResult < ( ) > {
352
358
unimplemented ! ( "setting date not implemented (unsupported target)" ) ;
353
359
}
354
360
355
361
#[ cfg( target_os = "macos" ) ]
356
- fn set_system_datetime ( _date : DateTime < Utc > ) -> i32 {
357
- show_error ! ( "setting the date is not supported by macOS" ) ;
358
- 1
362
+ fn set_system_datetime ( _date : DateTime < Utc > ) -> UResult < ( ) > {
363
+ Err ( USimpleError :: new (
364
+ 1 ,
365
+ "setting the date is not supported by macOS" . to_string ( ) ,
366
+ ) )
359
367
}
360
368
361
369
#[ cfg( target_os = "redox" ) ]
362
- fn set_system_datetime ( _date : DateTime < Utc > ) -> i32 {
363
- show_error ! ( "setting the date is not supported by Redox" ) ;
364
- 1
370
+ fn set_system_datetime ( _date : DateTime < Utc > ) -> UResult < ( ) > {
371
+ Err ( USimpleError :: new (
372
+ 1 ,
373
+ "setting the date is not supported by Redox" . to_string ( ) ,
374
+ ) )
365
375
}
366
376
367
377
#[ cfg( all( unix, not( target_os = "macos" ) , not( target_os = "redox" ) ) ) ]
@@ -370,7 +380,7 @@ fn set_system_datetime(_date: DateTime<Utc>) -> i32 {
370
380
/// https://doc.rust-lang.org/libc/i686-unknown-linux-gnu/libc/fn.clock_settime.html
371
381
/// https://linux.die.net/man/3/clock_settime
372
382
/// https://www.gnu.org/software/libc/manual/html_node/Time-Types.html
373
- fn set_system_datetime ( date : DateTime < Utc > ) -> i32 {
383
+ fn set_system_datetime ( date : DateTime < Utc > ) -> UResult < ( ) > {
374
384
let timespec = timespec {
375
385
tv_sec : date. timestamp ( ) as _ ,
376
386
tv_nsec : date. timestamp_subsec_nanos ( ) as _ ,
@@ -379,11 +389,9 @@ fn set_system_datetime(date: DateTime<Utc>) -> i32 {
379
389
let result = unsafe { clock_settime ( CLOCK_REALTIME , & timespec) } ;
380
390
381
391
if result != 0 {
382
- let error = std:: io:: Error :: last_os_error ( ) ;
383
- show_error ! ( "cannot set date: {}" , error) ;
384
- error. raw_os_error ( ) . unwrap ( )
392
+ Err ( std:: io:: Error :: last_os_error ( ) . map_err_context ( || "cannot set date" . to_string ( ) ) )
385
393
} else {
386
- 0
394
+ Ok ( ( ) )
387
395
}
388
396
}
389
397
@@ -392,7 +400,7 @@ fn set_system_datetime(date: DateTime<Utc>) -> i32 {
392
400
/// See here for more:
393
401
/// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-setsystemtime
394
402
/// https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-systemtime
395
- fn set_system_datetime ( date : DateTime < Utc > ) -> i32 {
403
+ fn set_system_datetime ( date : DateTime < Utc > ) -> UResult < ( ) > {
396
404
let system_time = SYSTEMTIME {
397
405
wYear : date. year ( ) as WORD ,
398
406
wMonth : date. month ( ) as WORD ,
@@ -409,10 +417,8 @@ fn set_system_datetime(date: DateTime<Utc>) -> i32 {
409
417
let result = unsafe { SetSystemTime ( & system_time) } ;
410
418
411
419
if result == 0 {
412
- let error = std:: io:: Error :: last_os_error ( ) ;
413
- show_error ! ( "cannot set date: {}" , error) ;
414
- error. raw_os_error ( ) . unwrap ( )
420
+ Err ( std:: io:: Error :: last_os_error ( ) . map_err_context ( || "cannot set date" . to_string ( ) ) )
415
421
} else {
416
- 0
422
+ Ok ( ( ) )
417
423
}
418
424
}
0 commit comments