better error return in config
This commit is contained in:
		@@ -9,38 +9,52 @@ use crate::PROGRAM_NAME;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#[derive(Deserialize, Serialize, Debug)]
 | 
					#[derive(Deserialize, Serialize, Debug)]
 | 
				
			||||||
pub struct Config {
 | 
					pub struct Config {
 | 
				
			||||||
    pub cloudflare_zone_id: Box<str>,
 | 
					    pub zone_id: Box<str>,
 | 
				
			||||||
    pub cloudflare_api_key: Box<str>,
 | 
					    pub api_key: Box<str>,
 | 
				
			||||||
 | 
					    pub domains: Vec<Box<str>>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub async fn get_config_path() -> Option<PathBuf> {
 | 
					pub async fn get_config_path() -> Result<PathBuf, Vec<PathBuf>> {
 | 
				
			||||||
 | 
					    let mut tried_paths = Vec::with_capacity(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    match env::current_dir() {
 | 
					    match env::current_dir() {
 | 
				
			||||||
        Ok(current_dir) => {
 | 
					        Ok(current_dir) => {
 | 
				
			||||||
            let cwd_config = current_dir.join(format!("{}.toml", PROGRAM_NAME));
 | 
					            let cwd_config = current_dir.join(format!("{}.toml", PROGRAM_NAME));
 | 
				
			||||||
            if let Ok(meta) = fs::metadata(&cwd_config).await {
 | 
					
 | 
				
			||||||
                if meta.is_file() {
 | 
					            let is_valid_path = fs::metadata(&cwd_config)
 | 
				
			||||||
                    return Some(cwd_config);
 | 
					                .await
 | 
				
			||||||
                }
 | 
					                .map_or_else(|_| false, |meta| meta.is_file());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if is_valid_path {
 | 
				
			||||||
 | 
					                return Ok(cwd_config);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                tried_paths.push(cwd_config);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Err(e) => {
 | 
					        Err(e) => {
 | 
				
			||||||
            warn!("Failed to get current directory {:?}", &e);
 | 
					            warn!("Failed to get current working directory: {:?}", e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    match dirs::config_dir() {
 | 
					    match dirs::config_dir() {
 | 
				
			||||||
        Some(config_dir) => {
 | 
					        Some(config_dir) => {
 | 
				
			||||||
            let config_file = config_dir.join(PROGRAM_NAME).join("config.toml");
 | 
					            let config_file = config_dir.join(PROGRAM_NAME).join("config.toml");
 | 
				
			||||||
            if let Ok(meta) = fs::metadata(&config_file).await {
 | 
					
 | 
				
			||||||
                if meta.is_file() {
 | 
					            let is_valid_path = fs::metadata(&config_file)
 | 
				
			||||||
                    return Some(config_file);
 | 
					                .await
 | 
				
			||||||
 | 
					                .map_or_else(|_| false, |meta| meta.is_file());
 | 
				
			||||||
 | 
					            if is_valid_path {
 | 
				
			||||||
 | 
					                return Ok(config_file);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                tried_paths.push(config_file);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        None => {
 | 
				
			||||||
 | 
					            warn!("No configuration directory found.");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        None => {}
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    None
 | 
					    Err(tried_paths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub async fn read_config(path: &PathBuf) -> anyhow::Result<Config> {
 | 
					pub async fn read_config(path: &PathBuf) -> anyhow::Result<Config> {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/main.rs
									
									
									
									
									
								
							@@ -26,9 +26,19 @@ const fn nl_mgrp(group: u32) -> u32 {
 | 
				
			|||||||
async fn main() {
 | 
					async fn main() {
 | 
				
			||||||
    env_logger::init();
 | 
					    env_logger::init();
 | 
				
			||||||
    let config_path = match get_config_path().await {
 | 
					    let config_path = match get_config_path().await {
 | 
				
			||||||
        Some(cp) => cp,
 | 
					        Ok(cp) => cp,
 | 
				
			||||||
        None => {
 | 
					        Err(tried_paths) => {
 | 
				
			||||||
            error!("Failed to find any config file");
 | 
					            let extra: String = if !tried_paths.is_empty() {
 | 
				
			||||||
 | 
					                let joined = tried_paths
 | 
				
			||||||
 | 
					                    .iter()
 | 
				
			||||||
 | 
					                    .filter_map(|path| path.to_str())
 | 
				
			||||||
 | 
					                    .collect::<Vec<_>>()
 | 
				
			||||||
 | 
					                    .join(", ");
 | 
				
			||||||
 | 
					                format!(", tried the paths: '{}'", &joined)
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                String::with_capacity(0)
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            error!("Failed to find any config file{}", &extra);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user