1
- use std:: { env , path:: PathBuf } ;
1
+ use std:: path:: PathBuf ;
2
2
3
3
use anyhow:: { anyhow, Context , Result } ;
4
4
use aws_config:: meta:: region:: RegionProviderChain ;
@@ -12,31 +12,49 @@ use crate::prelude::*;
12
12
#[ command( version, about, long_about = None ) ]
13
13
struct Cli {
14
14
/// Path to the folder to backup
15
- ///
16
- /// If not specified, defaults to "/dockerbck"
17
- #[ arg( value_hint = clap:: ValueHint :: DirPath ) ]
15
+ #[ arg( value_hint = clap:: ValueHint :: DirPath , env = "DOCKERBCK_FOLDER" ) ]
18
16
folder : Option < PathBuf > ,
19
17
20
18
/// Specify a cron expression to run the backup periodically
21
19
///
22
20
/// If not specified, the backup will only run once
23
- #[ arg( short, long, value_name = "CRON" ) ]
21
+ #[ arg( short, long, value_name = "CRON" , env = "DOCKERBCK_SCHEDULE" ) ]
24
22
schedule : Option < String > ,
25
23
26
24
/// The AWS S3 region
27
- #[ arg( short = 'r' , long = "region" , value_name = "REGION" ) ]
25
+ #[ arg(
26
+ short = 'r' ,
27
+ long = "region" ,
28
+ value_name = "REGION" ,
29
+ env = "AWS_REGION"
30
+ ) ]
28
31
aws_region : Option < String > ,
29
32
30
33
/// The AWS S3 bucket name
31
- #[ arg( short = 'b' , long = "bucket" , value_name = "BUCKET" ) ]
34
+ #[ arg(
35
+ short = 'b' ,
36
+ long = "bucket" ,
37
+ value_name = "BUCKET" ,
38
+ env = "AWS_BUCKET"
39
+ ) ]
32
40
aws_bucket : Option < String > ,
33
41
34
42
/// The AWS S3 access key ID
35
- #[ arg( short = 'i' , long = "id" , value_name = "KEY_ID" ) ]
43
+ #[ arg(
44
+ short = 'i' ,
45
+ long = "id" ,
46
+ value_name = "KEY_ID" ,
47
+ env = "AWS_ACCESS_KEY_ID"
48
+ ) ]
36
49
aws_key_id : Option < String > ,
37
50
38
51
/// The AWS S3 secret access key
39
- #[ arg( short = 't' , long = "token" , value_name = "KEY" ) ]
52
+ #[ arg(
53
+ short = 't' ,
54
+ long = "token" ,
55
+ value_name = "KEY" ,
56
+ env = "AWS_SECRET_ACCESS_KEY"
57
+ ) ]
40
58
aws_key : Option < String > ,
41
59
}
42
60
@@ -58,27 +76,11 @@ pub struct Params {
58
76
59
77
/// Parse the command-line arguments and environment variables into runtime params
60
78
pub async fn parse_config ( ) -> Result < Params > {
61
- let mut params = Cli :: parse ( ) ;
62
-
63
- params. folder = params
64
- . folder
65
- . or_else ( || env:: var ( "DOCKERBCK_FOLDER" ) . ok ( ) . map ( PathBuf :: from) )
66
- . or_else ( || Some ( PathBuf :: from ( "/dockerbox" ) ) ) ;
67
-
68
- params. schedule = params
69
- . schedule
70
- . or_else ( || env:: var ( "DOCKERBCK_SCHEDULE" ) . ok ( ) ) ;
79
+ let params = Cli :: parse ( ) ;
71
80
72
- params. aws_region = params. aws_region . or_else ( || env:: var ( "AWS_REGION" ) . ok ( ) ) ;
73
- params. aws_bucket = params. aws_bucket . or_else ( || env:: var ( "AWS_BUCKET" ) . ok ( ) ) ;
74
- params. aws_key_id = params
75
- . aws_key_id
76
- . or_else ( || env:: var ( "AWS_ACCESS_KEY_ID" ) . ok ( ) ) ;
77
- params. aws_key = params
78
- . aws_key
79
- . or_else ( || env:: var ( "AWS_SECRET_ACCESS_KEY" ) . ok ( ) ) ;
80
-
81
- let folder = params. folder . or_panic ( ) ; // Ok to unwrap due to default value
81
+ let Some ( folder) = params. folder else {
82
+ return Err ( anyhow ! ( "No folder path was provided" ) ) ;
83
+ } ;
82
84
let folder = folder
83
85
. canonicalize ( )
84
86
. with_context ( || anyhow ! ( "Could not resolve path {}" , folder. to_string_lossy( ) ) ) ?;
0 commit comments