stellar_scaffold_cli/
lib.rs

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