1use anyhow::Result;
2use serde::{Deserialize, Serialize};
3use std::path::Path;
4
5#[derive(Debug, Clone, Deserialize, Serialize)]
6pub struct Config {
7 pub server: ServerConfig,
8}
9
10#[derive(Debug, Clone, Deserialize, Serialize)]
11pub struct ServerConfig {
12 #[serde(default = "default_control_port")]
13 pub control_port: u16,
14
15 #[serde(default = "default_proxy_port")]
16 pub proxy_port: u16,
17
18 #[serde(default = "default_proxy_url")]
20 pub proxy_url: String,
21
22 #[serde(default)]
25 pub include_paths: Vec<String>,
26
27 #[serde(default)]
31 pub exclude_paths: Vec<String>,
32
33 pub control_auth: Option<String>,
34}
35
36fn default_control_port() -> u16 {
37 17809
38}
39
40fn default_proxy_port() -> u16 {
41 3000
42}
43
44fn default_proxy_url() -> String {
45 "http://localhost:8080".to_string()
46}
47
48impl Config {
49 pub fn from_file(path: impl AsRef<Path>) -> Result<Self> {
50 let content = std::fs::read_to_string(path)?;
51 let config: Config = toml::from_str(&content)?;
52 Ok(config)
53 }
54}
55
56impl Default for ServerConfig {
57 fn default() -> Self {
58 Self {
59 control_port: default_control_port(),
60 proxy_port: default_proxy_port(),
61 proxy_url: default_proxy_url(),
62 include_paths: vec![],
63 exclude_paths: vec![],
64 control_auth: None,
65 }
66 }
67}