rust: improve the type on DirsMultiset::from_manifest
It could only return an HgPathError, but we didn't express this in the
type, so we needed some unreachable!()s. Now that is expressed in the
type.
--- a/rust/hg-core/src/dirstate/dirs_multiset.rs Wed Aug 02 09:59:49 2023 -0400
+++ b/rust/hg-core/src/dirstate/dirs_multiset.rs Tue Aug 08 11:50:26 2023 -0400
@@ -62,7 +62,7 @@
/// Initializes the multiset from a manifest.
pub fn from_manifest(
manifest: &[impl AsRef<HgPath>],
- ) -> Result<Self, DirstateMapError> {
+ ) -> Result<Self, HgPathError> {
let mut multiset = DirsMultiset {
inner: FastHashMap::default(),
};
@@ -80,19 +80,17 @@
pub fn add_path(
&mut self,
path: impl AsRef<HgPath>,
- ) -> Result<(), DirstateMapError> {
+ ) -> Result<(), HgPathError> {
for subpath in files::find_dirs(path.as_ref()) {
if subpath.as_bytes().last() == Some(&b'/') {
// TODO Remove this once PathAuditor is certified
// as the only entrypoint for path data
let second_slash_index = subpath.len() - 1;
- return Err(DirstateMapError::InvalidPath(
- HgPathError::ConsecutiveSlashes {
- bytes: path.as_ref().as_bytes().to_owned(),
- second_slash_index,
- },
- ));
+ return Err(HgPathError::ConsecutiveSlashes {
+ bytes: path.as_ref().as_bytes().to_owned(),
+ second_slash_index,
+ });
}
if let Some(val) = self.inner.get_mut(subpath) {
*val += 1;
--- a/rust/hg-core/src/lib.rs Wed Aug 02 09:59:49 2023 -0400
+++ b/rust/hg-core/src/lib.rs Tue Aug 08 11:50:26 2023 -0400
@@ -66,6 +66,12 @@
InvalidPath(HgPathError),
}
+impl From<HgPathError> for DirstateMapError {
+ fn from(error: HgPathError) -> Self {
+ Self::InvalidPath(error)
+ }
+}
+
impl fmt::Display for DirstateMapError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
@@ -83,6 +89,12 @@
Common(errors::HgError),
}
+impl From<HgPathError> for DirstateError {
+ fn from(error: HgPathError) -> Self {
+ Self::Map(DirstateMapError::InvalidPath(error))
+ }
+}
+
impl fmt::Display for DirstateError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
--- a/rust/hg-core/src/matchers.rs Wed Aug 02 09:59:49 2023 -0400
+++ b/rust/hg-core/src/matchers.rs Tue Aug 08 11:50:26 2023 -0400
@@ -15,11 +15,10 @@
},
utils::{
files::find_dirs,
- hg_path::{HgPath, HgPathBuf},
+ hg_path::{HgPath, HgPathBuf, HgPathError},
Escaped,
},
- DirsMultiset, DirstateMapError, FastHashMap, IgnorePattern, PatternError,
- PatternSyntax,
+ DirsMultiset, FastHashMap, IgnorePattern, PatternError, PatternSyntax,
};
use crate::dirstate::status::IgnoreFnType;
@@ -177,7 +176,7 @@
}
impl FileMatcher {
- pub fn new(files: Vec<HgPathBuf>) -> Result<Self, DirstateMapError> {
+ pub fn new(files: Vec<HgPathBuf>) -> Result<Self, HgPathError> {
let dirs = DirsMultiset::from_manifest(&files)?;
Ok(Self {
files: HashSet::from_iter(files.into_iter()),
@@ -760,20 +759,12 @@
let mut parents = HashSet::new();
parents.extend(
- DirsMultiset::from_manifest(&dirs)
- .map_err(|e| match e {
- DirstateMapError::InvalidPath(e) => e,
- _ => unreachable!(),
- })?
+ DirsMultiset::from_manifest(&dirs)?
.iter()
.map(ToOwned::to_owned),
);
parents.extend(
- DirsMultiset::from_manifest(&roots)
- .map_err(|e| match e {
- DirstateMapError::InvalidPath(e) => e,
- _ => unreachable!(),
- })?
+ DirsMultiset::from_manifest(&roots)?
.iter()
.map(ToOwned::to_owned),
);