##// END OF EJS Templates
hg-core: remove the `Operation` trait...
hg-core: remove the `Operation` trait There is no way to currently define a trait which can both return references to `self` and to passed data, which is what we would need. Generic Associated Types may fix this and allow us to have a unified interface. See: rust #44265 Differential Revision: https://phab.mercurial-scm.org/D8862

File last commit:

r45917:452ece56 default
r45917:452ece56 default
Show More
root.rs
76 lines | 2.1 KiB | application/rls-services+xml | RustLexer
use crate::commands::Command;
use crate::error::{CommandError, CommandErrorKind};
use crate::ui::Ui;
use hg::operations::{FindRoot, FindRootError, FindRootErrorKind};
use hg::utils::files::get_bytes_from_path;
use std::path::PathBuf;
pub const HELP_TEXT: &str = "
Print the root directory of the current repository.
Returns 0 on success.
";
pub struct RootCommand {
ui: Ui,
}
impl RootCommand {
pub fn new() -> Self {
RootCommand { ui: Ui::new() }
}
fn display_found_path(
&self,
path_buf: PathBuf,
) -> Result<(), CommandError> {
let bytes = get_bytes_from_path(path_buf);
// TODO use formating macro
self.ui.write_stdout(&[bytes.as_slice(), b"\n"].concat())?;
Err(CommandErrorKind::Ok.into())
}
fn display_error(&self, error: FindRootError) -> Result<(), CommandError> {
match error.kind {
FindRootErrorKind::RootNotFound(path) => {
let bytes = get_bytes_from_path(path);
// TODO use formating macro
self.ui.write_stderr(
&[
b"abort: no repository found in '",
bytes.as_slice(),
b"' (.hg not found)!\n",
]
.concat(),
)?;
Err(CommandErrorKind::RootNotFound.into())
}
FindRootErrorKind::GetCurrentDirError(e) => {
// TODO use formating macro
self.ui.write_stderr(
&[
b"abort: error getting current working directory: ",
e.to_string().as_bytes(),
b"\n",
]
.concat(),
)?;
Err(CommandErrorKind::CurrentDirNotFound.into())
}
}
}
}
impl Command for RootCommand {
fn run(&self) -> Result<(), CommandError> {
match FindRoot::new().run() {
Ok(path_buf) => self.display_found_path(path_buf),
Err(e) => self.display_error(e),
}
}
}