1use std::path::PathBuf;
6
7use clap::Parser;
8use hmac::{digest::InvalidLength, Hmac, Mac};
9use sha2::Sha256;
10
11use crate::pathutils::Paths;
12
13#[derive(Parser, Clone)]
14pub struct EnvVars {
15 #[arg(env)]
17 pub db_name: String,
19 #[arg(env)]
20 pub db_host: String,
22 #[arg(env)]
23 pub db_port: String,
25 #[arg(env)]
26 pub db_user: String,
28 #[arg(env)]
29 pub db_password: String,
31
32 #[arg(env)]
34 pub gh_client_id: String,
36 #[arg(env)]
37 pub gh_org_admin_token: String,
39 #[arg(env)]
40 jwt_secret: String,
42 #[arg(env)]
43 pub gh_client_secret: String,
45 #[arg(env, default_value = "")]
46 pub gh_org_name: String,
48 #[arg(env, default_value = "")]
49 pub gh_org_team_slug: String,
51 #[arg(env, default_value = "")]
52 pub gh_admin_usernames: String,
54
55 #[arg(env, default_value = "10")]
57 pub max_upload_limit: usize,
59 #[arg(env, default_value = "./log/application.log")]
60 pub log_location: PathBuf,
62
63 #[arg(env, default_value = "https://static.metakgp.org")]
65 static_files_url: String,
67 #[arg(env, default_value = "/srv/static")]
68 static_file_storage_location: PathBuf,
70 #[arg(env, default_value = "/iqps/uploaded")]
71 uploaded_qps_path: PathBuf,
73 #[arg(env, default_value = "/peqp/qp")]
74 library_qps_path: PathBuf,
76
77 #[arg(env, default_value = "8080")]
79 pub server_port: i32,
81
82 #[arg(env, default_value = "https://qp.metakgp.org,http://localhost:5173")]
84 pub cors_allowed_origins: String,
86
87 #[arg(skip)]
88 pub paths: Paths,
90}
91
92impl EnvVars {
93 pub fn process(mut self) -> Result<Self, Box<dyn std::error::Error>> {
95 self.paths = Paths::new(
96 &self.static_files_url,
97 &self.static_file_storage_location,
98 &self.uploaded_qps_path,
99 &self.library_qps_path,
100 )?;
101 self.log_location = std::path::absolute(self.log_location)?;
102
103 Ok(self)
104 }
105
106 pub fn get_jwt_key(&self) -> Result<Hmac<Sha256>, InvalidLength> {
108 Hmac::new_from_slice(self.jwt_secret.as_bytes())
109 }
110}