use std::{collections::HashMap, path::PathBuf};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
pub name: String,
#[serde(default)]
pub bular_id: Option<String>,
#[serde(default, rename = "static", skip_serializing_if = "Option::is_none")]
pub _static: Option<StaticConfig>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub paths: Vec<Path>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StaticConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub build: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dist: Option<PathBuf>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dev: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Path {
pub path: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<u16>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub headers: HashMap<String, String>,
#[serde(default, flatten)]
pub destination: Option<Destination>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Destination {
Rewrite { to: String },
Redirect { redirect: String },
Rust {
#[serde(rename = "crate")]
_crate: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
bin: Option<String>,
},
Final { r#final: bool },
}
pub fn default_config(name: String, bular_id: Option<String>) -> Config {
Config {
name: name.clone(),
bular_id,
_static: None,
paths: vec![Path {
path: "/*".into(),
status: None,
headers: Default::default(),
destination: Some(Destination::Rust {
_crate: name, bin: None,
}),
}],
}
}