aboutsummaryrefslogtreecommitdiffstats
path: root/src/cmd.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd.rs')
-rw-r--r--src/cmd.rs33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/cmd.rs b/src/cmd.rs
index 8d305d2..fd6c689 100644
--- a/src/cmd.rs
+++ b/src/cmd.rs
@@ -9,7 +9,7 @@ mod watch;
struct Command {
name: &'static str,
cmd: &'static dyn for<'a, 'b> Fn(clap::App<'a, 'b>) -> clap::App<'a, 'b>,
- run: &'static dyn for<'a> Fn(&clap::ArgMatches<'a>) -> Result<()>,
+ config: &'static dyn Fn() -> Box<dyn crate::config::Config>,
log_level: &'static str,
}
@@ -17,37 +17,37 @@ const COMMANDS: &[Command] = &[
Command {
name: "stream",
cmd: &stream::cmd,
- run: &stream::run,
+ config: &stream::config,
log_level: "error",
},
Command {
name: "server",
cmd: &server::cmd,
- run: &server::run,
+ config: &server::config,
log_level: "info",
},
Command {
name: "watch",
cmd: &watch::cmd,
- run: &watch::run,
+ config: &watch::config,
log_level: "error",
},
Command {
name: "record",
cmd: &record::cmd,
- run: &record::run,
+ config: &record::config,
log_level: "error",
},
Command {
name: "play",
cmd: &play::cmd,
- run: &play::run,
+ config: &play::config,
log_level: "error",
},
];
pub fn parse<'a>() -> Result<clap::ArgMatches<'a>> {
- let mut app = clap::App::new(crate::util::program_name()?)
+ let mut app = clap::App::new(program_name()?)
.about("Stream your terminal for other people to watch")
.author(clap::crate_authors!())
.version(clap::crate_version!());
@@ -69,9 +69,26 @@ pub fn run(matches: &clap::ArgMatches<'_>) -> Result<()> {
chosen_submatches = submatches;
}
}
+
env_logger::from_env(
env_logger::Env::default().default_filter_or(chosen_cmd.log_level),
)
.init();
- (chosen_cmd.run)(chosen_submatches)
+
+ let mut config = (chosen_cmd.config)();
+ config.merge_args(chosen_submatches)?;
+ config.run()
+}
+
+fn program_name() -> Result<String> {
+ let program =
+ std::env::args().next().context(crate::error::MissingArgv)?;
+ let path = std::path::Path::new(&program);
+ let filename = path.file_name();
+ Ok(filename
+ .ok_or_else(|| Error::NotAFileName {
+ path: path.to_string_lossy().to_string(),
+ })?
+ .to_string_lossy()
+ .to_string())
}