//! Path defaults and path-blank-or-default predicates. // Filesystem constants used as defaults for config paths. pub const CONFIG_PATH: &str = "config"; pub const CONFIG_FILE: &str = "config.yml"; pub const SOURCE_FILE: &str = "source.yml"; pub const MAPPING_FILE: &str = "mapping.yml"; pub const TEMPLATE_FILE: &str = "template.yml"; pub const API_PROXY_FILE: &str = "api-proxy.yml"; pub const USER_FILE: &str = "user.txt"; pub const USER_GROUP_FILE: &str = "groups.txt"; pub const DEFAULT_WEB_DIR: &str = "web"; pub const DEFAULT_BACKUP_DIR: &str = "backup"; pub const DEFAULT_CACHE_DIR: &str = "cache"; pub const DEFAULT_STORAGE_TEMP_DIR: &str = "tmp"; pub const DEFAULT_USER_CONFIG_DIR: &str = "user_config"; pub const DEFAULT_RECORDING_DIR: &str = "recordings"; pub const DEFAULT_STORAGE_DIR: &str = "data"; // TODO rename to storage and use data for config, storage, ... pub const DEFAULT_CUSTOM_STREAM_RESPONSE_PATH: &str = "resources"; pub fn get_default_web_root() -> String { DEFAULT_WEB_DIR.to_string() } pub fn is_blank_or_default_web_root(value: &str) -> bool { let normalized = value.trim().replace('\\', "/"); if normalized.is_empty() { return true; } let normalized = normalized.trim_end_matches('/'); normalized.trim_start_matches("./") == DEFAULT_WEB_DIR } pub fn is_default_dir_path(value: &str, default_dir: &str) -> bool { let normalized = value.trim().replace('\\', "/"); let normalized = normalized.trim_end_matches('/'); let normalized = normalized.trim_start_matches("./"); let default_dir = default_dir.trim().replace('\\', "/"); let default_dir = default_dir.trim_end_matches('/'); normalized == default_dir } pub fn is_blank_or_default_recording_dir(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_dir_path(value, DEFAULT_RECORDING_DIR)) } pub fn default_recording_dir() -> Option { Some(DEFAULT_RECORDING_DIR.to_string()) } pub fn default_main_storage_dir() -> Option { Some(DEFAULT_STORAGE_DIR.to_string()) } pub fn default_main_backup_dir() -> Option { Some(DEFAULT_BACKUP_DIR.to_string()) } pub fn default_main_user_config_dir() -> Option { Some(DEFAULT_USER_CONFIG_DIR.to_string()) } pub fn default_main_mapping_path() -> Option { Some(format!("./{CONFIG_PATH}/{MAPPING_FILE}")) } pub fn default_main_template_path() -> Option { Some(format!("./{CONFIG_PATH}/{TEMPLATE_FILE}")) } pub fn default_custom_stream_response_path() -> Option { Some(DEFAULT_CUSTOM_STREAM_RESPONSE_PATH.to_string()) } pub fn default_user_file_path() -> Option { Some(format!("./{CONFIG_PATH}/{USER_FILE}")) } pub fn default_user_group_file_path() -> Option { Some(format!("./{CONFIG_PATH}/{USER_GROUP_FILE}")) } fn is_default_config_file_path(value: &str, file_name: &str) -> bool { let normalized = value.trim().replace('\\', "/"); let normalized = normalized.trim_start_matches("./"); normalized == file_name || normalized.rsplit_once('/').is_some_and(|(dir, file)| dir == CONFIG_PATH && file == file_name) } pub fn is_blank_or_default_custom_stream_response_path(path: &Option) -> bool { path.as_ref() .is_none_or(|value| value.trim().is_empty() || is_default_dir_path(value, DEFAULT_CUSTOM_STREAM_RESPONSE_PATH)) } pub fn is_blank_or_default_mapping_path(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_config_file_path(value, MAPPING_FILE)) } pub fn is_blank_or_default_template_path(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_config_file_path(value, TEMPLATE_FILE)) } pub fn is_blank_or_default_storage_dir(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_dir_path(value, DEFAULT_STORAGE_DIR)) } pub fn is_blank_or_default_backup_dir(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_dir_path(value, DEFAULT_BACKUP_DIR)) } pub fn is_blank_or_default_user_config_dir(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_dir_path(value, DEFAULT_USER_CONFIG_DIR)) } pub fn is_blank_or_default_user_file_path(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_config_file_path(value, USER_FILE)) } pub fn is_blank_or_default_user_group_file_path(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_config_file_path(value, USER_GROUP_FILE)) } pub fn is_blank_or_default_cache_dir(path: &Option) -> bool { path.as_ref().is_none_or(|value| value.trim().is_empty() || is_default_dir_path(value, DEFAULT_CACHE_DIR)) } pub fn normalize_optional_dir(path: &Option, default_dir: &str) -> Option { path.as_ref().and_then(|value| { if value.trim().is_empty() || is_default_dir_path(value, default_dir) { None } else { Some(value.clone()) } }) } pub fn normalize_optional_config_file_path(path: &Option, default_file_name: &str) -> Option { path.as_ref().and_then(|value| { if value.trim().is_empty() || is_default_config_file_path(value, default_file_name) { None } else { Some(value.clone()) } }) }