mirror of
https://github.com/ouch-org/ouch.git
synced 2025-06-06 11:35:45 +00:00
fix(error): return result in list_archive
Refactor list_archive functions to return results directly for better error handling.
This commit is contained in:
parent
9e1c30bb86
commit
39cef75dfe
@ -48,12 +48,13 @@ pub fn unpack_archive(
|
|||||||
pub fn list_archive(
|
pub fn list_archive(
|
||||||
archive_path: &Path,
|
archive_path: &Path,
|
||||||
password: Option<&[u8]>,
|
password: Option<&[u8]>,
|
||||||
) -> impl Iterator<Item = crate::Result<FileInArchive>> {
|
) -> crate::Result<impl Iterator<Item = crate::Result<FileInArchive>>> {
|
||||||
let archive = match password {
|
let archive = match password {
|
||||||
Some(password) => Archive::with_password(archive_path, password),
|
Some(password) => Archive::with_password(archive_path, password),
|
||||||
None => Archive::new(archive_path),
|
None => Archive::new(archive_path),
|
||||||
};
|
};
|
||||||
match archive.open_for_listing() {
|
|
||||||
|
let result = match archive.open_for_listing() {
|
||||||
Ok(iter) => iter.map(|item| {
|
Ok(iter) => iter.map(|item| {
|
||||||
let item = item?;
|
let item = item?;
|
||||||
let is_dir = item.is_directory();
|
let is_dir = item.is_directory();
|
||||||
@ -61,8 +62,10 @@ pub fn list_archive(
|
|||||||
|
|
||||||
Ok(FileInArchive { path, is_dir })
|
Ok(FileInArchive { path, is_dir })
|
||||||
}).collect::<Vec<_>>().into_iter(),
|
}).collect::<Vec<_>>().into_iter(),
|
||||||
Err(e) => vec![Err(Error::UnrarError{reason: e.to_string()})].into_iter(),
|
Err(e) => return Err(Error::UnrarError{reason: e.to_string()}),
|
||||||
}
|
};
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn no_compression() -> Error {
|
pub fn no_compression() -> Error {
|
||||||
|
@ -167,7 +167,7 @@ where
|
|||||||
reader,
|
reader,
|
||||||
output_path,
|
output_path,
|
||||||
sevenz_rust::Password::from(password.to_str().map_err(|_| {
|
sevenz_rust::Password::from(password.to_str().map_err(|_| {
|
||||||
Error::InvalidPassword("7z requires that all passwords are valid UTF-8")
|
Error::InvalidPassword{reason: "7z requires that all passwords are valid UTF-8".to_string()}
|
||||||
})?),
|
})?),
|
||||||
entry_extract_fn,
|
entry_extract_fn,
|
||||||
)?,
|
)?,
|
||||||
@ -181,14 +181,8 @@ where
|
|||||||
pub fn list_archive(
|
pub fn list_archive(
|
||||||
archive_path: &Path,
|
archive_path: &Path,
|
||||||
password: Option<&[u8]>,
|
password: Option<&[u8]>,
|
||||||
) -> impl Iterator<Item = crate::Result<FileInArchive>> {
|
) -> crate::Result<impl Iterator<Item = crate::Result<FileInArchive>>> {
|
||||||
let reader = fs::File::open(archive_path);
|
let reader = fs::File::open(archive_path)?;
|
||||||
|
|
||||||
if let Err(e) = reader {
|
|
||||||
return vec![Err(Error::IoError {reason:e.to_string()})].into_iter();
|
|
||||||
}
|
|
||||||
|
|
||||||
let reader = reader.unwrap();
|
|
||||||
|
|
||||||
let mut files = Vec::new();
|
let mut files = Vec::new();
|
||||||
|
|
||||||
@ -204,7 +198,7 @@ pub fn list_archive(
|
|||||||
Some(password) => {
|
Some(password) => {
|
||||||
let password = match password.to_str() {
|
let password = match password.to_str() {
|
||||||
Ok(p) => p,
|
Ok(p) => p,
|
||||||
Err(_) => return vec![Err(Error::InvalidPassword("7z requires that all passwords are valid UTF-8"))].into_iter(),
|
Err(err) => return Err(Error::InvalidPassword{ reason: err.to_string()}),
|
||||||
};
|
};
|
||||||
sevenz_rust::decompress_with_extract_fn_and_password(
|
sevenz_rust::decompress_with_extract_fn_and_password(
|
||||||
reader,
|
reader,
|
||||||
@ -217,8 +211,8 @@ pub fn list_archive(
|
|||||||
};
|
};
|
||||||
|
|
||||||
if let Err(e) = result {
|
if let Err(e) = result {
|
||||||
return vec![Err(e.into())].into_iter();
|
return Err(e.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
files.into_iter()
|
Ok(files.into_iter())
|
||||||
}
|
}
|
||||||
|
@ -88,9 +88,9 @@ pub fn list_archive_contents(
|
|||||||
if formats.len() > 1 {
|
if formats.len() > 1 {
|
||||||
let mut temp_file = tempfile::NamedTempFile::new()?;
|
let mut temp_file = tempfile::NamedTempFile::new()?;
|
||||||
io::copy(&mut reader, &mut temp_file)?;
|
io::copy(&mut reader, &mut temp_file)?;
|
||||||
Box::new(crate::archive::rar::list_archive(temp_file.path(), password))
|
Box::new(crate::archive::rar::list_archive(temp_file.path(), password)?)
|
||||||
} else {
|
} else {
|
||||||
Box::new(crate::archive::rar::list_archive(archive_path, password))
|
Box::new(crate::archive::rar::list_archive(archive_path, password)?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(not(feature = "unrar"))]
|
#[cfg(not(feature = "unrar"))]
|
||||||
@ -109,7 +109,7 @@ pub fn list_archive_contents(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Box::new(sevenz::list_archive(archive_path, password))
|
Box::new(sevenz::list_archive(archive_path, password)?)
|
||||||
}
|
}
|
||||||
Gzip | Bzip | Lz4 | Lzma | Snappy | Zstd => {
|
Gzip | Bzip | Lz4 | Lzma | Snappy | Zstd => {
|
||||||
panic!("Not an archive! This should never happen, if it does, something is wrong with `CompressionFormat::is_archive()`. Please report this error!");
|
panic!("Not an archive! This should never happen, if it does, something is wrong with `CompressionFormat::is_archive()`. Please report this error!");
|
||||||
|
@ -40,7 +40,7 @@ pub enum Error {
|
|||||||
// currently only RAR when built without the `unrar` feature
|
// currently only RAR when built without the `unrar` feature
|
||||||
UnsupportedFormat { reason: String },
|
UnsupportedFormat { reason: String },
|
||||||
/// Invalid password provided
|
/// Invalid password provided
|
||||||
InvalidPassword(&'static str),
|
InvalidPassword { reason: String },
|
||||||
/// UnrarError From unrar::error::UnrarError
|
/// UnrarError From unrar::error::UnrarError
|
||||||
UnrarError { reason: String },
|
UnrarError { reason: String },
|
||||||
}
|
}
|
||||||
@ -152,7 +152,7 @@ impl fmt::Display for Error {
|
|||||||
Error::UnsupportedFormat { reason } => {
|
Error::UnsupportedFormat { reason } => {
|
||||||
FinalError::with_title("Recognised but unsupported format").detail(reason.clone())
|
FinalError::with_title("Recognised but unsupported format").detail(reason.clone())
|
||||||
}
|
}
|
||||||
Error::InvalidPassword(reason) => FinalError::with_title("Invalid password").detail(*reason),
|
Error::InvalidPassword{reason} => FinalError::with_title("Invalid password").detail(reason.clone()),
|
||||||
Error::UnrarError{reason} => FinalError::with_title("Unrar error").detail(reason.clone()),
|
Error::UnrarError{reason} => FinalError::with_title("Unrar error").detail(reason.clone()),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user