1use crate::{cmd, Command};
2use ql2::term::TermType;
3use serde::Serialize;
4use std::ops::Add;
5
6pub trait Arg {
7 fn arg(self) -> cmd::Arg<()>;
8}
9
10impl Arg for cmd::Arg<()> {
11 fn arg(self) -> cmd::Arg<()> {
12 self
13 }
14}
15
16impl Arg for Command {
17 fn arg(self) -> cmd::Arg<()> {
18 Command::new(TermType::Add).with_arg(self).into_arg()
19 }
20}
21
22impl<T> Arg for T
23where
24 T: Serialize,
25{
26 fn arg(self) -> cmd::Arg<()> {
27 Command::from_json(self).arg()
28 }
29}
30
31impl<T> Add<T> for Command
32where
33 T: Arg,
34{
35 type Output = Self;
36
37 fn add(self, arg: T) -> Self {
38 arg.arg().with_parent(self).into_cmd()
39 }
40}