fixup! feat(plugin): plugin config is pretty printed when saving it

This commit is contained in:
Mika Vilpas 2024-05-09 19:53:09 +03:00
parent 58b6e75368
commit 1293409295
2 changed files with 31 additions and 19 deletions

View file

@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Debug)]
pub struct PackageConfig { pub struct PackageConfig {
pub plugin: PluginConfig, pub plugin: PluginConfig,
pub flavor: FlavorConfig, pub flavor: FlavorConfig,
@ -12,17 +12,17 @@ impl Default for PackageConfig {
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Debug)]
pub struct PluginConfig { pub struct PluginConfig {
pub deps: Vec<GitDependency>, pub deps: Vec<GitDependency>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Debug)]
pub struct FlavorConfig { pub struct FlavorConfig {
pub deps: Vec<GitDependency>, pub deps: Vec<GitDependency>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Debug)]
pub struct GitDependency { pub struct GitDependency {
#[serde(rename = "use")] #[serde(rename = "use")]
pub use_: String, pub use_: String,

View file

@ -12,12 +12,14 @@ pub enum InstallFromConfig {
impl Package { impl Package {
pub(crate) async fn add_to_config(use_: &str) -> Result<()> { pub(crate) async fn add_to_config(use_: &str) -> Result<()> {
let mut package = Self::new(use_, None); let mut package = Self::new(use_, None);
let Some(name) = package.name() else { bail!("Invalid package `use`") }; if package.name().is_none() {
bail!("Invalid package `use`: '{}'", use_);
};
let path = Xdg::config_dir().join("package.toml"); let path = Xdg::config_dir().join("package.toml");
let mut config = Self::parse_config(&fs::read_to_string(&path).await.unwrap_or_default())?; let mut config = parse_config(&fs::read_to_string(&path).await.unwrap_or_default())?;
ensure_unique(&config, name)?; ensure_unique(&config, &package)?;
package.add().await?; package.add().await?;
let dep = let dep =
@ -40,7 +42,7 @@ impl Package {
return Ok(()); return Ok(());
}; };
let mut config = Self::parse_config(&s)?; let mut config = parse_config(&s)?;
let deps = match section { let deps = match section {
InstallFromConfig::Plugin => &mut config.plugin.deps, InstallFromConfig::Plugin => &mut config.plugin.deps,
InstallFromConfig::Flavor => &mut config.flavor.deps, InstallFromConfig::Flavor => &mut config.flavor.deps,
@ -63,18 +65,20 @@ impl Package {
fs::write(path, toml::to_string_pretty(&config)?).await.context("Failed to write package.toml") fs::write(path, toml::to_string_pretty(&config)?).await.context("Failed to write package.toml")
} }
fn parse_config(s: &str) -> Result<PackageConfig, anyhow::Error> {
toml::from_str::<PackageConfig>(s).context("Failed to parse package.toml")
}
} }
fn ensure_unique(doc: &PackageConfig, name: &str) -> Result<()> { fn parse_config(s: &str) -> Result<PackageConfig, anyhow::Error> {
if doc.plugin.deps.iter().any(|v| v.use_ == name) { toml::from_str::<PackageConfig>(s).context("Failed to parse package.toml")
bail!("Plugin `{name}` already exists in package.toml"); }
fn ensure_unique(doc: &PackageConfig, dep: &Package) -> Result<()> {
let use_ = dep.use_().as_ref().to_owned();
if doc.plugin.deps.iter().any(|v| v.use_ == use_) {
bail!("Plugin `{use_}` already exists in package.toml");
} }
if doc.flavor.deps.iter().any(|v| v.use_ == name) { if doc.flavor.deps.iter().any(|v| v.use_ == use_) {
bail!("Flavor `{name}` already exists in package.toml"); bail!("Flavor `{use_}` already exists in package.toml");
} }
Ok(()) Ok(())
@ -88,14 +92,22 @@ mod tests {
#[test] #[test]
fn test_disallow_duplicate() { fn test_disallow_duplicate() {
let config = PackageConfig::default(); let config = PackageConfig::default();
let package = Package::new("test", None);
assert!(ensure_unique(&config, "test").is_ok()); assert!(ensure_unique(&config, &package).is_ok());
let config = PackageConfig {
plugin: PluginConfig { deps: vec![GitDependency { use_: "test".into(), commit: None }] },
flavor: FlavorConfig { deps: vec![] },
};
assert!(ensure_unique(&config, &package).is_err());
let config = PackageConfig { let config = PackageConfig {
plugin: PluginConfig { deps: vec![] }, plugin: PluginConfig { deps: vec![] },
flavor: FlavorConfig { deps: vec![GitDependency { use_: "test".into(), commit: None }] }, flavor: FlavorConfig { deps: vec![GitDependency { use_: "test".into(), commit: None }] },
}; };
assert!(ensure_unique(&config, "test").is_err()); assert!(ensure_unique(&config, &package).is_err());
} }
} }