33 lines
1.1 KiB
Rust
33 lines
1.1 KiB
Rust
|
use super::*;
|
||
|
use crate::{model::ProgramId, program_runner::ProgramRunnerError};
|
||
|
use eyre::WrapErr;
|
||
|
|
||
|
#[derive(Debug, Serialize, Deserialize)]
|
||
|
#[serde(rename_all = "camelCase")]
|
||
|
pub struct RunProgramRequest {
|
||
|
program_id: ProgramId,
|
||
|
}
|
||
|
|
||
|
impl IRequest for RunProgramRequest {
|
||
|
type Response = ResponseMessage;
|
||
|
|
||
|
fn exec(&mut self, ctx: &mut RequestContext) -> RequestFuture<Self::Response> {
|
||
|
let mut program_runner = ctx.program_runner.clone();
|
||
|
let program_id = self.program_id;
|
||
|
Box::pin(async move {
|
||
|
match program_runner.run_program_id(program_id).await {
|
||
|
Ok(program) => Ok(ResponseMessage::new(format!(
|
||
|
"running program '{}'",
|
||
|
program.name
|
||
|
))),
|
||
|
Err(e @ ProgramRunnerError::InvalidProgramId(_)) => Err(RequestError::with_name(
|
||
|
ErrorCode::NoSuchProgram,
|
||
|
e,
|
||
|
"program",
|
||
|
)),
|
||
|
Err(e) => Err(e).wrap_err("could not run program")?,
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|