loam_cli/
lib.rs

1#![allow(
2    clippy::missing_errors_doc,
3    clippy::must_use_candidate,
4    clippy::missing_panics_doc
5)]
6pub mod commands;
7
8use std::path::Path;
9
10pub use commands::Root;
11
12pub fn parse_cmd<T>(s: &str) -> Result<T, clap::Error>
13where
14    T: clap::CommandFactory + clap::FromArgMatches,
15{
16    let input = shlex::split(s).ok_or_else(|| {
17        clap::Error::raw(
18            clap::error::ErrorKind::InvalidValue,
19            format!("Invalid input for command:\n{s}"),
20        )
21    })?;
22    T::from_arg_matches_mut(&mut T::command().no_binary_name(true).get_matches_from(input))
23}
24
25pub trait CommandParser<T> {
26    fn parse(s: &str) -> Result<T, clap::Error>;
27
28    fn parse_arg_vec(s: &[&str]) -> Result<T, clap::Error>;
29}
30
31impl<T> CommandParser<T> for T
32where
33    T: clap::CommandFactory + clap::FromArgMatches,
34{
35    fn parse(s: &str) -> Result<T, clap::Error> {
36        parse_cmd(s)
37    }
38
39    fn parse_arg_vec(args: &[&str]) -> Result<T, clap::Error> {
40        T::from_arg_matches_mut(&mut T::command().no_binary_name(true).get_matches_from(args))
41    }
42}
43
44pub trait Pwd {
45    fn set_pwd(&mut self, pwd: &Path);
46}