1pub use clap_exec_derive::*;
2
3#[derive(Debug, thiserror::Error)]
4pub enum RunnerError {
5 #[error("{0}")]
6 Custom(String),
7}
8
9pub trait Executable {
10 type UserState;
11 fn execute(&mut self, _state: &mut Self::UserState) -> Result<(), RunnerError>;
12}
13
14pub trait Runner: Executable {
15 fn before_global(&mut self, _state: &mut Self::UserState) -> Result<(), RunnerError> {
16 Ok(())
17 }
18
19 fn before(&mut self, _state: &mut Self::UserState) -> Result<(), RunnerError> {
20 Ok(())
21 }
22
23 fn run(&mut self, state: &mut Self::UserState) -> Result<(), RunnerError>;
24
25 fn after(&self, _state: &Self::UserState) -> Result<(), RunnerError> {
26 Ok(())
27 }
28
29 fn after_global(&self, _state: &Self::UserState) -> Result<(), RunnerError> {
30 Ok(())
31 }
32}
33
34pub trait ExecutableAsync {
35 type UserState: Send + Sync;
36 fn execute(&mut self, _state: &mut Self::UserState) -> impl Future<Output = Result<(), RunnerError>> + Send;
37}
38
39pub trait RunnerAsync: ExecutableAsync {
40 fn before_global(&mut self, _state: &mut Self::UserState) -> impl Future<Output = Result<(), RunnerError>> + Send {
41 async { Ok(()) }
42 }
43
44 fn before(&mut self, _state: &mut Self::UserState) -> impl Future<Output = Result<(), RunnerError>> + Send {
45 async { Ok(()) }
46 }
47
48 fn run(&mut self, state: &mut Self::UserState) -> impl Future<Output = Result<(), RunnerError>> + Send;
49
50 fn after(&self, _state: &Self::UserState) -> impl Future<Output = Result<(), RunnerError>> + Send {
51 async { Ok(()) }
52 }
53
54 fn after_global(&self, _state: &Self::UserState) -> impl Future<Output = Result<(), RunnerError>> + Send {
55 async { Ok(()) }
56 }
57}