root.rs
76 lines
| 2.1 KiB
| application/rls-services+xml
|
RustLexer
|
r45592 | use crate::commands::Command; | ||
use crate::error::{CommandError, CommandErrorKind}; | ||||
use crate::ui::Ui; | ||||
use hg::operations::{FindRoot, FindRootError, FindRootErrorKind, Operation}; | ||||
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), | ||||
} | ||||
} | ||||
} | ||||