use crate::{api::client::Client, error::Error, project::Project, writer::Writer};
use std::error::Error as StdError;
pub(crate) trait Runner {
async fn api_client(&mut self) -> Result<Client, Error> {
if false {
return Err(self.error(
Some("Login required"),
Some("You need to log in to use this command"),
None,
));
}
Ok(Client::new(false).await?)
}
async fn project(&self) -> Result<Project, Error> {
let project = Project::from_current_dir();
if project.is_err() {
return Err(self.error(
Some("Project error"),
Some(&project.err().unwrap().to_string()),
None,
));
}
Ok(project?)
}
async fn run(&mut self) -> Result<(), Error>;
fn error(
&self,
title: Option<&str>,
description: Option<&str>,
origin: Option<Box<dyn StdError>>,
) -> Error {
if let Some(origin) = origin {
log::error!("{origin:?}");
}
if let Some(title) = title {
Error::new(title, description)
} else {
Error::new(
"Failed to run the command",
Some("Please report a bug at support@deploykinetics.com"),
)
}
}
fn server_error(&self, origin: Option<Box<dyn StdError>>) -> Error {
self.error(Some("Server error"), Some("Try again later."), origin)
}
}
pub(crate) trait Runnable {
fn runner(&self, writer: &Writer) -> impl Runner;
}