use serde::Deserialize;
use tokio::fs::read_to_string;
#[derive(Debug, Deserialize)]
pub struct FedoraConfig {
#[serde(rename(deserialize = "FAS"))]
pub fas: FASConfig,
#[serde(rename(deserialize = "fedora-update-feedback"))]
pub fuf: Option<FUFConfig>,
}
#[derive(Debug, Deserialize)]
pub struct FASConfig {
pub username: String,
}
#[derive(Debug, Deserialize)]
pub struct FUFConfig {
#[serde(rename = "check-obsoleted")]
pub check_obsoleted: Option<bool>,
#[serde(rename = "check-pending")]
pub check_pending: Option<bool>,
#[serde(rename = "check-unpushed")]
pub check_unpushed: Option<bool>,
#[serde(rename = "save-password")]
pub save_password: Option<bool>,
}
pub async fn get_config() -> Result<FedoraConfig, String> {
let home = match dirs::home_dir() {
Some(path) => path,
None => {
return Err(String::from("Unable to determine $HOME."));
},
};
let config_path = home.join(".config/fedora.toml");
let config_str = match read_to_string(&config_path).await {
Ok(string) => string,
Err(_) => {
return Err(String::from(
"Unable to read configuration file from ~/.config/fedora.toml",
));
},
};
let config: FedoraConfig = match toml::from_str(&config_str) {
Ok(config) => config,
Err(_) => {
return Err(String::from(
"Unable to parse configuration file from ~/.config/fedora.toml",
));
},
};
Ok(config)
}
pub async fn get_legacy_username() -> Result<Option<String>, String> {
let home = match dirs::home_dir() {
Some(path) => path,
None => {
return Err(String::from("Unable to determine $HOME."));
},
};
let file_path = home.join(".fedora.upn");
let username = match read_to_string(&file_path).await {
Ok(string) => Some(string.trim().to_string()),
Err(error) => {
return if error.kind() == std::io::ErrorKind::NotFound {
Ok(None)
} else {
Err(error.to_string())
};
},
};
Ok(username)
}