changeset 45438:ed95ccc94333

rhg: pass `ui` to `Command` `run` Allow implementation of `From<clap::ArgMatches> for Command` Differential Revision: https://phab.mercurial-scm.org/D8954
author Antoine Cezar <antoine.cezar@octobus.net>
date Tue, 04 Aug 2020 16:11:23 +0200
parents e339693addc0
children fbc373b7cbc3
files rust/rhg/src/commands.rs rust/rhg/src/commands/files.rs rust/rhg/src/commands/root.rs rust/rhg/src/main.rs
diffstat 4 files changed, 19 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/rust/rhg/src/commands.rs	Mon Aug 03 11:55:59 2020 +0200
+++ b/rust/rhg/src/commands.rs	Tue Aug 04 16:11:23 2020 +0200
@@ -1,10 +1,11 @@
 pub mod files;
 pub mod root;
 use crate::error::CommandError;
+use crate::ui::Ui;
 
 /// The common trait for rhg commands
 ///
 /// Normalize the interface of the commands provided by rhg
-pub trait Command<'a> {
-    fn run(&self) -> Result<(), CommandError>;
+pub trait Command {
+    fn run(&self, ui: &Ui) -> Result<(), CommandError>;
 }
--- a/rust/rhg/src/commands/files.rs	Mon Aug 03 11:55:59 2020 +0200
+++ b/rust/rhg/src/commands/files.rs	Tue Aug 04 16:11:23 2020 +0200
@@ -11,18 +11,16 @@
 Returns 0 on success.
 ";
 
-pub struct FilesCommand<'a> {
-    ui: &'a Ui,
-}
+pub struct FilesCommand {}
 
-impl<'a> FilesCommand<'a> {
-    pub fn new(ui: &'a Ui) -> Self {
-        FilesCommand { ui }
+impl FilesCommand {
+    pub fn new() -> Self {
+        FilesCommand {}
     }
 }
 
-impl<'a> Command<'a> for FilesCommand<'a> {
-    fn run(&self) -> Result<(), CommandError> {
+impl Command for FilesCommand {
+    fn run(&self, ui: &Ui) -> Result<(), CommandError> {
         let operation_builder = ListTrackedFiles::new()?;
         let operation = operation_builder.load().map_err(|err| {
             CommandErrorKind::Abort(Some(
@@ -47,7 +45,7 @@
             .expect("cwd was already checked within the repository");
         let rooted_cwd = HgPathBuf::from(get_bytes_from_path(rooted_cwd));
 
-        let mut stdout = self.ui.stdout_buffer();
+        let mut stdout = ui.stdout_buffer();
 
         for file in files {
             stdout.write_all(relativize_path(file, &rooted_cwd).as_ref())?;
--- a/rust/rhg/src/commands/root.rs	Mon Aug 03 11:55:59 2020 +0200
+++ b/rust/rhg/src/commands/root.rs	Tue Aug 04 16:11:23 2020 +0200
@@ -10,24 +10,22 @@
 Returns 0 on success.
 ";
 
-pub struct RootCommand<'a> {
-    ui: &'a Ui,
-}
+pub struct RootCommand {}
 
-impl<'a> RootCommand<'a> {
-    pub fn new(ui: &'a Ui) -> Self {
-        RootCommand { ui }
+impl RootCommand {
+    pub fn new() -> Self {
+        RootCommand {}
     }
 }
 
-impl<'a> Command<'a> for RootCommand<'a> {
-    fn run(&self) -> Result<(), CommandError> {
+impl Command for RootCommand {
+    fn run(&self, ui: &Ui) -> Result<(), CommandError> {
         let path_buf = FindRoot::new().run()?;
 
         let bytes = get_bytes_from_path(path_buf);
 
         // TODO use formating macro
-        self.ui.write_stdout(&[bytes.as_slice(), b"\n"].concat())?;
+        ui.write_stdout(&[bytes.as_slice(), b"\n"].concat())?;
 
         Ok(())
     }
--- a/rust/rhg/src/main.rs	Mon Aug 03 11:55:59 2020 +0200
+++ b/rust/rhg/src/main.rs	Tue Aug 04 16:11:23 2020 +0200
@@ -29,8 +29,8 @@
 
     let command_result = match matches.subcommand_name() {
         Some(name) => match name {
-            "root" => commands::root::RootCommand::new(&ui).run(),
-            "files" => commands::files::FilesCommand::new(&ui).run(),
+            "root" => commands::root::RootCommand::new().run(&ui),
+            "files" => commands::files::FilesCommand::new().run(&ui),
             _ => std::process::exit(exitcode::UNIMPLEMENTED_COMMAND),
         },
         _ => {