Fix typing in cargo_crates_v1.rs and optimize append_to_file

Use `Vec::reserve_exact ` in `append_to_file` to avoid unnecessary allocation

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>
This commit is contained in:
Jiahao XU 2025-06-04 00:17:18 +10:00 committed by GitHub
parent a2df287683
commit a356179804
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -68,14 +68,14 @@ impl CratesToml<'_> {
} }
pub fn remove(&mut self, name: &str) { pub fn remove(&mut self, name: &str) {
self.remove(&[name]); self.remove_all(&[name]);
} }
/// * `sorted_names` - must be sorted /// * `sorted_names` - must be sorted
pub fn remove_all(&mut self, sorted_names: &[&str]) { pub fn remove_all(&mut self, sorted_names: &[&str]) {
self.v1.retain(|(s, _bin)| { self.v1.retain(|(s, _bin)| {
s.split_once(' ') s.split_once(' ')
.map(|(crate_name, _rest)| sorted_names.binary_search(crate_name).is_err()) .map(|(crate_name, _rest)| sorted_names.binary_search(&crate_name).is_err())
.unwrap_or_default() .unwrap_or_default()
}); });
} }
@ -114,10 +114,12 @@ impl CratesToml<'_> {
pub fn append_to_file(file: &mut File, crates: &[CrateInfo]) -> Result<(), CratesTomlParseError> { pub fn append_to_file(file: &mut File, crates: &[CrateInfo]) -> Result<(), CratesTomlParseError> {
let mut c1 = CratesToml::load_from_reader(&mut *file)?; let mut c1 = CratesToml::load_from_reader(&mut *file)?;
let mut crate_names: Vec<_> = crates.iter().map(|metadata| &metadata.name).collect(); let mut crate_names: Vec<_> = crates.iter().map(|metadata| metadata.name.as_str()).collect();
crate_names.sort_unstable(); crate_names.sort_unstable();
c1.remove_all(&crate_names); c1.remove_all(&crate_names);
c1.v1.reserve_exact(crates.len());
for metadata in crates { for metadata in crates {
let name = &metadata.name; let name = &metadata.name;
let version = &metadata.current_version; let version = &metadata.current_version;
@ -135,22 +137,13 @@ impl CratesToml<'_> {
Ok(()) Ok(())
} }
pub fn append_to_path<'a, Iter>( pub fn append_to_path(path: impl AsRef<Path>, crates: &[CrateInfo]) -> Result<(), CratesTomlParseError> {
path: impl AsRef<Path>,
iter: Iter,
) -> Result<(), CratesTomlParseError>
where
Iter: IntoIterator<Item = &'a CrateInfo>,
{
let mut file = create_if_not_exist(path.as_ref())?; let mut file = create_if_not_exist(path.as_ref())?;
Self::append_to_file(&mut file, iter) Self::append_to_file(&mut file, crates)
} }
pub fn append<'a, Iter>(iter: Iter) -> Result<(), CratesTomlParseError> pub fn append(crates: &[CrateInfo]) -> Result<(), CratesTomlParseError> {
where Self::append_to_path(Self::default_path()?, crates)
Iter: IntoIterator<Item = &'a CrateInfo>,
{
Self::append_to_path(Self::default_path()?, iter)
} }
/// Return BTreeMap with crate name as key and its corresponding version /// Return BTreeMap with crate name as key and its corresponding version