add example config and just overall improve the config data stuff

This commit is contained in:
askiiart 2025-05-15 00:23:21 -05:00
parent 0d0cb945a1
commit 9887d5196f
Signed by untrusted user who does not match committer: askiiart
GPG key ID: 6A32977DAF31746A
3 changed files with 83 additions and 35 deletions

View file

@ -1,10 +1,15 @@
use clap::{Parser, Subcommand};
use std::path::PathBuf;
use clap::Parser;
#[derive(Parser)]
#[command(version, about, long_about = None)]
pub(crate) struct Cli {
#[arg(short, long, value_name = "FILE", default_value = "shoe.conf")]
pub(crate) config: PathBuf,
/// Prints an example config
#[arg(long, action)]
pub(crate) print_example_config: bool,
}
#[derive(Subcommand)]
pub(crate) enum Commands {}

68
src/data.rs Normal file
View file

@ -0,0 +1,68 @@
use std::{collections::HashMap, path::PathBuf, str::FromStr};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct SiteInfo {
name: String,
aliases: Vec<String>,
/// Aliases for this subdomain - will have the same exact settings
/// The socket address (e.g. `192.168.1.8:8080`) or port number (if on `localhost`) of the service to reverse proxy
address: String,
/// What auth file to use - 0 means none
#[serde(skip_serializing_if = "Option::is_none")]
auth: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
conf_file: Option<PathBuf>,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Config {
/// What directory to output the conf files to
#[serde(default = "default_output_dir")]
output_dir: PathBuf,
domain: String,
/// Subdomains/services in the format `subdomain: SiteInfo`
subdomains: HashMap<String, SiteInfo>,
/// Paths to the htpasswd file for each auth number - starts at 1, goes to 255; see [`SiteInfo`]
#[serde(skip_serializing_if = "Option::is_none")]
htpasswd_files: Option<Vec<PathBuf>>,
/// Default IP for if it's not specified in `socket_address_or_port` in [`SiteInfo`]. Defaults to localhost if not specified.
#[serde(default = "default_default_ip")]
default_ip: String,
}
/// Generates the default
pub(crate) fn example_config() -> String {
let mut subdomains: HashMap<String, SiteInfo> = HashMap::new();
subdomains.insert(
"qbittorrent".to_string(),
SiteInfo {
name: "Qbittorrent".to_string(),
aliases: vec!["qb".to_string()],
address: "6011".to_string(),
auth: None,
conf_file: None,
},
);
return serde_yml::to_string(
&(Config {
output_dir: default_output_dir(),
domain: "example.net".to_string(),
subdomains: subdomains,
htpasswd_files: None,
default_ip: default_default_ip(),
}),
)
.unwrap();
}
// ----------------------------------------------------- DEFAULTS -----------------------------------------------------
fn default_output_dir() -> PathBuf {
return PathBuf::from_str("conf.d").unwrap();
}
fn default_default_ip() -> String {
return "localhost".to_string();
}

View file

@ -1,33 +1,9 @@
use clap::Parser;
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, path::PathBuf};
use cli::Commands;
use std::{collections::HashMap, path::PathBuf, process::exit};
mod build;
mod cli;
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct SiteInfo {
name: String,
subdomain: String,
///
socket_address_or_port: String,
/// What auth file to use
auth: u8,
conf_file: PathBuf,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Config {
output_dir: String,
domain: String,
/// Subdomains/services in the format `subdomain: SiteInfo`
subdomains: HashMap<String, SiteInfo>,
/// Paths to the htpasswd file for each auth number - starts at 0, goes to 255; see [`SiteInfo`]
htpasswd_files: Vec<PathBuf>,
/// Default IP for if it's not specified in `socket_address_or_port` in [`SiteInfo`]. Defaults to localhost if not specified.
#[serde(default = "default_default_ip")]
default_ip: String
}
mod data;
fn main() {
build::completion_builder().unwrap();
@ -36,11 +12,10 @@ fn main() {
let config = args.config;
if args.print_example_config {
println!("{}", data::example_config());
exit(0);
}
println!("Config: {}", config.to_str().unwrap())
}
// ---------------------------------------------------------------------------------
fn default_default_ip() -> String {
return "localhost".to_string();
}