pub trait Tool<'tool>: Send + Sync + Describable<'tool> + Detector<'tool> + Resolvable<'tool> + Downloadable<'tool> + Verifiable<'tool> + Installable<'tool> + Executable<'tool> + Shimable<'tool> {
// Provided methods
fn before_setup<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn setup<'life0, 'life1, 'async_trait>(
&'life0 mut self,
initial_version: &'life1 str
) -> Pin<Box<dyn Future<Output = Result<bool, ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn is_setup<'life0, 'life1, 'async_trait>(
&'life0 mut self,
initial_version: &'life1 str
) -> Pin<Box<dyn Future<Output = Result<bool, ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn after_setup<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn cleanup<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn before_teardown<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn teardown<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn after_teardown<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), ProtoError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
}