raw
1use std::path::PathBuf;
2
3use clap::Parser as _;
4use figment::{
5 Figment,
6 providers::{Env, Format, Serialized, Toml},
7};
8
9#[derive(Debug, Clone, clap::Parser, serde::Serialize, serde::Deserialize)]
10#[command(version, about)]
11pub struct Config {
12 #[arg(short, long, default_value_t = default_port())]
14 pub port: u16,
15
16 #[arg(short = 'r', long, default_value = default_repo_directory().into_os_string())]
18 pub project_root: PathBuf,
19
20 #[arg(short, long, default_value_t = default_site_name())]
22 pub site_name: String,
23
24 #[arg(short, long, default_value_t = default_export_ok())]
26 pub export_ok: String,
27
28 #[arg(short, long, default_value_t = String::new())]
30 pub clone_base: String,
31
32 #[arg(short, long, default_value_t = default_log_per_page())]
34 pub log_per_page: usize,
35}
36
37impl Config {
38 pub fn load() -> crate::utils::error::Result<Self> {
39 let config: Self = Figment::new()
40 .merge(Serialized::defaults(Self::parse()))
41 .merge(Toml::file("bile.toml"))
42 .merge(Env::prefixed("BILE_"))
43 .extract()?;
44
45 Ok(config)
46 }
47
48 pub fn finalize(self) -> crate::utils::error::Result<Self> {
49 Ok(Self {
50 port: self.port,
51 project_root: self.project_root.canonicalize()?,
52 site_name: self.site_name,
53 export_ok: self.export_ok,
54 clone_base: self.clone_base,
55 log_per_page: self.log_per_page,
56 })
57 }
58}
59
60impl Default for Config {
61 fn default() -> Self {
62 Self {
63 port: default_port(),
64 project_root: default_repo_directory(),
65 site_name: default_site_name(),
66 export_ok: default_export_ok(),
67 clone_base: String::new(),
68 log_per_page: default_log_per_page(),
69 }
70 }
71}
72
73const fn default_port() -> u16 {
74 80
75}
76
77fn default_repo_directory() -> PathBuf {
78 PathBuf::from("./repos")
79}
80
81fn default_site_name() -> String {
82 "bile".to_string()
83}
84
85fn default_export_ok() -> String {
86 "git-daemon-export-ok".to_string()
87}
88
89const fn default_log_per_page() -> usize {
90 100
91}
92