diff --git a/rust/Cargo.lock b/rust/Cargo.lock --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -199,6 +199,16 @@ ] [[package]] +name = "derive_more" +version = "0.99.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "difference" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -293,6 +303,7 @@ "bytes-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.11 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", "format-bytes 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "im-rc 15.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -696,6 +707,7 @@ version = "0.1.0" dependencies = [ "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.11 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "format-bytes 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "hg-core 0.1.0", @@ -939,6 +951,7 @@ "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" "checksum crossbeam-utils 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" "checksum ctor 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484" +"checksum derive_more 0.99.11 (registry+https://github.com/rust-lang/crates.io-index)" = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" diff --git a/rust/hg-core/Cargo.toml b/rust/hg-core/Cargo.toml --- a/rust/hg-core/Cargo.toml +++ b/rust/hg-core/Cargo.toml @@ -11,6 +11,7 @@ [dependencies] bytes-cast = "0.1" byteorder = "1.3.4" +derive_more = "0.99" im-rc = "15.0.*" lazy_static = "1.4.0" memchr = "2.3.3" diff --git a/rust/hg-core/src/config/layer.rs b/rust/hg-core/src/config/layer.rs --- a/rust/hg-core/src/config/layer.rs +++ b/rust/hg-core/src/config/layer.rs @@ -226,7 +226,7 @@ } } -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum ConfigError { Parse { origin: ConfigOrigin, @@ -239,15 +239,10 @@ io_error: std::io::Error, }, /// Any IO error that isn't expected + #[from] IO(std::io::Error), } -impl From for ConfigError { - fn from(e: std::io::Error) -> Self { - Self::IO(e) - } -} - fn make_regex(pattern: &'static str) -> Regex { Regex::new(pattern).expect("expected a valid regex") } diff --git a/rust/hg-core/src/dirstate/status.rs b/rust/hg-core/src/dirstate/status.rs --- a/rust/hg-core/src/dirstate/status.rs +++ b/rust/hg-core/src/dirstate/status.rs @@ -265,7 +265,7 @@ pub traversed: Vec, } -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum StatusError { /// Generic IO error IO(std::io::Error), @@ -277,22 +277,6 @@ pub type StatusResult = Result; -impl From for StatusError { - fn from(e: PatternError) -> Self { - StatusError::Pattern(e) - } -} -impl From for StatusError { - fn from(e: HgPathError) -> Self { - StatusError::Path(e) - } -} -impl From for StatusError { - fn from(e: std::io::Error) -> Self { - StatusError::IO(e) - } -} - impl ToString for StatusError { fn to_string(&self) -> String { match self { diff --git a/rust/hg-core/src/lib.rs b/rust/hg-core/src/lib.rs --- a/rust/hg-core/src/lib.rs +++ b/rust/hg-core/src/lib.rs @@ -89,6 +89,7 @@ DirstatePackError::CorruptedEntry(e.to_string()) } } + #[derive(Debug, PartialEq)] pub enum DirstateMapError { PathNotFound(HgPathBuf), @@ -108,7 +109,7 @@ } } -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum DirstateError { Parse(DirstateParseError), Pack(DirstatePackError), @@ -116,24 +117,14 @@ IO(std::io::Error), } -impl From for DirstateError { - fn from(e: DirstateParseError) -> Self { - DirstateError::Parse(e) - } -} - -impl From for DirstateError { - fn from(e: DirstatePackError) -> Self { - DirstateError::Pack(e) - } -} - -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum PatternError { + #[from] Path(HgPathError), UnsupportedSyntax(String), UnsupportedSyntaxInFile(String, String, usize), TooLong(usize), + #[from] IO(std::io::Error), /// Needed a pattern that can be turned into a regex but got one that /// can't. This should only happen through programmer error. @@ -163,27 +154,3 @@ } } } - -impl From for DirstateError { - fn from(e: DirstateMapError) -> Self { - DirstateError::Map(e) - } -} - -impl From for DirstateError { - fn from(e: std::io::Error) -> Self { - DirstateError::IO(e) - } -} - -impl From for PatternError { - fn from(e: std::io::Error) -> Self { - PatternError::IO(e) - } -} - -impl From for PatternError { - fn from(e: HgPathError) -> Self { - PatternError::Path(e) - } -} diff --git a/rust/hg-core/src/operations/debugdata.rs b/rust/hg-core/src/operations/debugdata.rs --- a/rust/hg-core/src/operations/debugdata.rs +++ b/rust/hg-core/src/operations/debugdata.rs @@ -16,9 +16,10 @@ } /// Error type for `debug_data` -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum DebugDataError { /// Error when reading a `revlog` file. + #[from] IoError(std::io::Error), /// The revision has not been found. InvalidRevision, @@ -32,12 +33,6 @@ UnknowRevlogDataFormat(u8), } -impl From for DebugDataError { - fn from(err: std::io::Error) -> Self { - DebugDataError::IoError(err) - } -} - impl From for DebugDataError { fn from(err: RevlogError) -> Self { match err { diff --git a/rust/hg-core/src/operations/list_tracked_files.rs b/rust/hg-core/src/operations/list_tracked_files.rs --- a/rust/hg-core/src/operations/list_tracked_files.rs +++ b/rust/hg-core/src/operations/list_tracked_files.rs @@ -17,7 +17,7 @@ use std::convert::From; /// Error type for `Dirstate` methods -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum ListDirstateTrackedFilesError { /// Error when reading the `dirstate` file IoError(std::io::Error), @@ -25,12 +25,6 @@ ParseError(DirstateParseError), } -impl From for ListDirstateTrackedFilesError { - fn from(err: std::io::Error) -> Self { - ListDirstateTrackedFilesError::IoError(err) - } -} - /// List files under Mercurial control in the working directory /// by reading the dirstate pub struct Dirstate { diff --git a/rust/hg-core/src/revlog/node.rs b/rust/hg-core/src/revlog/node.rs --- a/rust/hg-core/src/revlog/node.rs +++ b/rust/hg-core/src/revlog/node.rs @@ -49,7 +49,7 @@ /// the size or return an error at runtime. /// /// [`nybbles_len`]: #method.nybbles_len -#[derive(Copy, Clone, Debug, PartialEq, BytesCast)] +#[derive(Copy, Clone, Debug, PartialEq, BytesCast, derive_more::From)] #[repr(transparent)] pub struct Node { data: NodeData, @@ -60,12 +60,6 @@ data: [0; NODE_BYTES_LENGTH], }; -impl From for Node { - fn from(data: NodeData) -> Node { - Node { data } - } -} - /// Return an error if the slice has an unexpected length impl<'a> TryFrom<&'a [u8]> for &'a Node { type Error = (); diff --git a/rust/hg-core/src/utils/hg_path.rs b/rust/hg-core/src/utils/hg_path.rs --- a/rust/hg-core/src/utils/hg_path.rs +++ b/rust/hg-core/src/utils/hg_path.rs @@ -367,7 +367,9 @@ } } -#[derive(Default, Eq, Ord, Clone, PartialEq, PartialOrd, Hash)] +#[derive( + Default, Eq, Ord, Clone, PartialEq, PartialOrd, Hash, derive_more::From, +)] pub struct HgPathBuf { inner: Vec, } @@ -408,12 +410,6 @@ } } -impl From> for HgPathBuf { - fn from(vec: Vec) -> Self { - Self { inner: vec } - } -} - impl> From<&T> for HgPathBuf { fn from(s: &T) -> HgPathBuf { s.as_ref().to_owned() diff --git a/rust/rhg/Cargo.toml b/rust/rhg/Cargo.toml --- a/rust/rhg/Cargo.toml +++ b/rust/rhg/Cargo.toml @@ -10,6 +10,7 @@ [dependencies] hg-core = { path = "../hg-core"} clap = "2.33.1" +derive_more = "0.99" log = "0.4.11" micro-timer = "0.3.1" env_logger = "0.7.1" diff --git a/rust/rhg/src/error.rs b/rust/rhg/src/error.rs --- a/rust/rhg/src/error.rs +++ b/rust/rhg/src/error.rs @@ -8,13 +8,14 @@ use std::path::PathBuf; /// The kind of command error -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum CommandError { /// The root of the repository cannot be found RootNotFound(PathBuf), /// The current directory cannot be found CurrentDirNotFound(std::io::Error), /// `.hg/requires` + #[from] RequirementsError(RequirementsError), /// The standard output stream cannot be written to StdoutError, @@ -93,9 +94,3 @@ } } } - -impl From for CommandError { - fn from(err: RequirementsError) -> Self { - CommandError::RequirementsError(err) - } -}