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), } } }