diff --git a/src/edit/display.rs b/src/edit/display.rs index 6ab29c3..cb002e0 100644 --- a/src/edit/display.rs +++ b/src/edit/display.rs @@ -34,7 +34,7 @@ impl Display { }, dep_selector: FilterView { selected_index: 0, - data: FilterView::data_from_package(document.get_package_by_id(0)?, "")?, + data: FilterView::data_from_package(document.get_package_by_index(0)?, "")?, }, feature_selector: FilterView { selected_index: 0, diff --git a/src/io/parsing/dependency.rs b/src/io/parsing/dependency.rs index 0e9771d..994a269 100644 --- a/src/io/parsing/dependency.rs +++ b/src/io/parsing/dependency.rs @@ -1,7 +1,6 @@ use crate::io::parsing::package::get_package_from_version; -use crate::io::util::get_item_from_doc; +use crate::io::util::get_dependecy_item_from_doc; use crate::project::dependency::feature::{EnabledState, FeatureData, SubFeature, SubFeatureType}; -use crate::project::dependency::util::get_path; use crate::project::dependency::{Dependency, DependencyType}; use cargo_metadata::PackageId; use color_eyre::eyre::{ContextCompat, eyre}; @@ -20,7 +19,7 @@ pub fn parse_dependency( let kind: DependencyType = dependency.kind.into(); let mut workspace = false; - let deps = get_item_from_doc(&get_path(&kind, &dependency.target), document)?; + let deps = get_dependecy_item_from_doc(&kind, &dependency.target, document)?; let deps = deps.as_table().context(format!( "could not parse dependencies as a table - {}", diff --git a/src/io/save.rs b/src/io/save.rs index 40506f2..a3a40b2 100644 --- a/src/io/save.rs +++ b/src/io/save.rs @@ -1,5 +1,4 @@ -use crate::io::util::{get_mut_item_from_doc, toml_document_from_path}; -use crate::project::dependency::util::get_path; +use crate::io::util::{get_mut_dependecy_item_from_doc, toml_document_from_path}; use crate::project::document::Document; use color_eyre::eyre::{ContextCompat, Error}; use std::fs; @@ -16,7 +15,7 @@ pub fn save_dependency( let features_to_enable = dependency.get_features_to_enable(); let mut doc = toml_document_from_path(&package.manifest_path)?; - let deps = get_mut_item_from_doc(&get_path(&dependency.kind, &dependency.target), &mut doc)?; + let deps = get_mut_dependecy_item_from_doc(&dependency.kind, &dependency.target, &mut doc)?; let deps = deps.as_table_mut().context(format!( "could not parse dependencies as a table - {}", @@ -94,8 +93,8 @@ pub fn save_dependency( } // update workspace deps - if let Some(workspace_index) = document.workspace_index() { - let workspace = document.get_package_by_id(workspace_index)?; + if let Some(workspace_package) = document.get_workspace_package() { + let workspace = workspace_package?; if workspace.name == package_name { document.update_workspace_deps()?; diff --git a/src/io/util.rs b/src/io/util.rs index 07d89c8..0a3188a 100644 --- a/src/io/util.rs +++ b/src/io/util.rs @@ -4,6 +4,8 @@ use std::fs; use std::path::Path; use std::str::FromStr; +use crate::project::dependency::DependencyType; + pub fn toml_document_from_path>( dir_path: P, ) -> color_eyre::Result { @@ -17,6 +19,15 @@ pub fn toml_document_from_path>( Ok(file_content.parse()?) } +pub fn get_mut_dependecy_item_from_doc<'a>( + kind: &DependencyType, + target: &Option, + document: &'a mut toml_edit::DocumentMut, +) -> color_eyre::Result<&'a mut toml_edit::Item> { + let path = get_dependency_path(kind, target); + get_mut_item_from_doc(&path, document) +} + pub fn get_mut_item_from_doc<'a>( path: &str, document: &'a mut toml_edit::DocumentMut, @@ -60,6 +71,15 @@ pub fn get_mut_item_from_doc<'a>( Ok(item) } +pub fn get_dependecy_item_from_doc<'a>( + kind: &DependencyType, + target: &Option, + document: &'a toml_edit::DocumentMut, +) -> color_eyre::Result<&'a toml_edit::Item> { + let path = get_dependency_path(kind, target); + get_item_from_doc(&path, document) +} + pub fn get_item_from_doc<'a>( path: &str, document: &'a toml_edit::DocumentMut, @@ -100,3 +120,22 @@ pub fn get_item_from_doc<'a>( Ok(item) } + +fn get_dependency_path(kind: &DependencyType, target: &Option) -> String { + let path = match kind { + DependencyType::Normal => "dependencies", + DependencyType::Development => "dev-dependencies", + DependencyType::Build => "build-dependencies", + DependencyType::Workspace => "workspace.dependencies", + DependencyType::Unknown => "dependencies", + }; + + if let Some(target) = target { + return match target { + Platform::Name(name) => format!("target.{}.{}", name, path), + Platform::Cfg(cfg) => format!("target.'cfg({})'.{}", cfg, path), + }; + } + + path.to_string() +} diff --git a/src/project/dependency/mod.rs b/src/project/dependency/mod.rs index 7b90936..0324b15 100644 --- a/src/project/dependency/mod.rs +++ b/src/project/dependency/mod.rs @@ -7,7 +7,6 @@ use console::{Emoji, style}; use itertools::Itertools; pub mod feature; -pub mod util; #[derive(Debug)] pub struct Dependency { diff --git a/src/project/dependency/util.rs b/src/project/dependency/util.rs deleted file mode 100644 index 30b4009..0000000 --- a/src/project/dependency/util.rs +++ /dev/null @@ -1,22 +0,0 @@ -use cargo_metadata::cargo_platform::Platform; - -use crate::project::dependency::DependencyType; - -pub fn get_path(kind: &DependencyType, target: &Option) -> String { - let path = match kind { - DependencyType::Normal => "dependencies", - DependencyType::Development => "dev-dependencies", - DependencyType::Build => "build-dependencies", - DependencyType::Workspace => "workspace.dependencies", - DependencyType::Unknown => "dependencies", - }; - - if let Some(target) = target { - return match target { - Platform::Name(name) => format!("target.{}.{}", name, path), - Platform::Cfg(cfg) => format!("target.'cfg({})'.{}", cfg, path), - }; - } - - path.to_string() -} diff --git a/src/project/document.rs b/src/project/document.rs index 0becba9..1cb7b29 100644 --- a/src/project/document.rs +++ b/src/project/document.rs @@ -118,7 +118,7 @@ impl Document { &self.packages } - pub fn get_package_by_id(&self, package_id: usize) -> Result<&Package> { + pub fn get_package_by_index(&self, package_id: usize) -> Result<&Package> { self.packages .get(package_id) .context(format!("no package for id {} found", package_id)) @@ -138,9 +138,11 @@ impl Document { .context(format!("no package with name {} found", package)) } - pub fn workspace_index(&self) -> Option { + pub fn get_workspace_package(&self) -> Option> { self.workspace_index + .map(|workspace_index| self.get_package_by_index(workspace_index)) } + pub fn is_workspace(&self) -> bool { self.packages.len() > 1 }