This commit is contained in:
		
							parent
							
								
									f4c82ada2e
								
							
						
					
					
						commit
						2eb64bbdc0
					
				| @ -262,6 +262,7 @@ pub enum Request { | ||||
|     CancelSectionRunId(sections::CancelSectionRunIdRequest), | ||||
|     PauseSectionRunner(sections::PauseSectionRunnerRequest), | ||||
|     RunProgram(programs::RunProgramRequest), | ||||
|     CancelProgram(programs::CancelProgramRequest), | ||||
| } | ||||
| 
 | ||||
| impl IRequest for Request { | ||||
| @ -274,6 +275,7 @@ impl IRequest for Request { | ||||
|             Request::CancelSectionRunId(req) => req.exec_erased(ctx), | ||||
|             Request::PauseSectionRunner(req) => req.exec_erased(ctx), | ||||
|             Request::RunProgram(req) => req.exec_erased(ctx), | ||||
|             Request::CancelProgram(req) => req.exec_erased(ctx), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -30,3 +30,35 @@ impl IRequest for RunProgramRequest { | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Serialize, Deserialize)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct CancelProgramRequest { | ||||
|     program_id: ProgramId, | ||||
| } | ||||
| 
 | ||||
| impl IRequest for CancelProgramRequest { | ||||
|     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 { | ||||
|             let cancelled = program_runner | ||||
|                 .cancel_program(program_id) | ||||
|                 .await | ||||
|                 .wrap_err("could not run cancel program")?; | ||||
|             match cancelled { | ||||
|                 Some(program) => Ok(ResponseMessage::new(format!( | ||||
|                     "program '{}' cancelled", | ||||
|                     program.name | ||||
|                 ))), | ||||
|                 None => Err(RequestError::with_name( | ||||
|                     ErrorCode::NoSuchProgram, | ||||
|                     "program was not running", | ||||
|                     "program", | ||||
|                 )), | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -297,19 +297,22 @@ impl Handler<RunProgram> for ProgramRunnerActor { | ||||
| } | ||||
| 
 | ||||
| #[derive(Message)] | ||||
| #[rtype(result = "()")] | ||||
| #[rtype(result = "Option<ProgramRef>")] | ||||
| struct CancelProgram(ProgramId); | ||||
| 
 | ||||
| impl Handler<CancelProgram> for ProgramRunnerActor { | ||||
|     type Result = (); | ||||
|     type Result = Option<ProgramRef>; | ||||
|     fn handle(&mut self, msg: CancelProgram, ctx: &mut Self::Context) -> Self::Result { | ||||
|         let CancelProgram(program_id) = msg; | ||||
|         let mut cancelled = None; | ||||
|         for run in self.run_queue.iter_mut() { | ||||
|             if run.program.id == program_id { | ||||
|                 run.state = RunState::Cancelled; | ||||
|                 cancelled = Some(run.program.clone()); | ||||
|             } | ||||
|         } | ||||
|         ctx.notify(Process); | ||||
|         cancelled | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -448,7 +451,7 @@ impl ProgramRunner { | ||||
|             .map_err(ProgramRunnerError::from) | ||||
|     } | ||||
| 
 | ||||
|     pub async fn cancel_program(&mut self, program_id: ProgramId) -> Result<()> { | ||||
|     pub async fn cancel_program(&mut self, program_id: ProgramId) -> Result<Option<ProgramRef>> { | ||||
|         self.addr | ||||
|             .send(CancelProgram(program_id)) | ||||
|             .await | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user