mylang_cli_ext/
command.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use std::marker::PhantomData;

use clap::{Command, Parser};

pub struct CommandFromParser<P>
where
    P: Parser,
{
    pub(crate) cmd: Command,
    parser: PhantomData<P>,
}

impl<P> CommandFromParser<P>
where
    P: Parser,
{
    pub fn new(cmd: Command) -> Self {
        Self {
            cmd,
            parser: PhantomData,
        }
    }
}

pub trait CommandFromParserExt<P>
where
    P: Parser,
{
    fn to_command() -> CommandFromParser<P>;
}

impl<P> CommandFromParserExt<P> for P
where
    P: Parser,
{
    fn to_command() -> CommandFromParser<P> {
        CommandFromParser::new(P::command())
    }
}