Impl new fn CratesToml::append_to_file (#629)

Prepare for fix for #588

* Impl new fn `CratesToml::append_to_file`
* Optimize `CratesToml::append_to_file`: Avoid dup monomorphization

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2022-12-28 11:33:35 +11:00 committed by GitHub
parent c87d42d2d8
commit 31c6524833
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -99,6 +99,37 @@ impl CratesToml<'_> {
self.write_to_file(&mut file)
}
pub fn append_to_file<'a, Iter>(file: &mut File, iter: Iter) -> Result<(), CratesTomlParseError>
where
Iter: IntoIterator<Item = &'a CrateInfo>,
{
fn inner(
file: &mut File,
iter: &mut dyn Iterator<Item = &CrateInfo>,
) -> Result<(), CratesTomlParseError> {
let mut c1 = CratesToml::load_from_reader(&mut *file)?;
for metadata in iter {
let name = &metadata.name;
let version = &metadata.current_version;
let source = Source::from(&metadata.source);
c1.remove(name);
c1.v1.push((
format!("{name} {version} ({source})"),
Cow::borrowed(&metadata.bins),
));
}
file.rewind()?;
c1.write_to_file(file)?;
Ok(())
}
inner(file, &mut iter.into_iter())
}
pub fn append_to_path<'a, Iter>(
path: impl AsRef<Path>,
iter: Iter,
@ -107,28 +138,7 @@ impl CratesToml<'_> {
Iter: IntoIterator<Item = &'a CrateInfo>,
{
let mut file = FileLock::new_exclusive(create_if_not_exist(path.as_ref())?)?;
let mut c1 = if file.metadata()?.len() != 0 {
Self::load_from_reader(&mut *file)?
} else {
Self::default()
};
for metadata in iter {
let name = &metadata.name;
let version = &metadata.current_version;
let source = Source::from(&metadata.source);
c1.remove(name);
c1.v1.push((
format!("{name} {version} ({source})"),
Cow::borrowed(&metadata.bins),
));
}
file.rewind()?;
c1.write_to_file(&mut file)?;
Ok(())
Self::append_to_file(&mut file, iter)
}
pub fn append<'a, Iter>(iter: Iter) -> Result<(), CratesTomlParseError>