Add ability to run program from MQTT
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is failing
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	continuous-integration/drone/push Build is failing
				
			This commit is contained in:
		
							parent
							
								
									6043f4bac7
								
							
						
					
					
						commit
						4f030e7bcd
					
				| @ -68,6 +68,7 @@ async fn main() -> Result<()> { | ||||
|     let request_context = mqtt::RequestContext { | ||||
|         sections: sections.clone(), | ||||
|         section_runner: section_runner.clone(), | ||||
|         program_runner: program_runner.clone(), | ||||
|     }; | ||||
|     let mut mqtt_interface = mqtt::MqttInterfaceTask::start(mqtt_options, request_context); | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| use crate::{model::Sections, section_runner::SectionRunner}; | ||||
| use crate::{model::Sections, program_runner::ProgramRunner, section_runner::SectionRunner}; | ||||
| 
 | ||||
| use futures_util::ready; | ||||
| use futures_util::FutureExt; | ||||
| @ -6,11 +6,13 @@ use num_derive::FromPrimitive; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use std::{fmt, future::Future, pin::Pin, task::Poll}; | ||||
| 
 | ||||
| mod programs; | ||||
| mod sections; | ||||
| 
 | ||||
| pub struct RequestContext { | ||||
|     pub sections: Sections, | ||||
|     pub section_runner: SectionRunner, | ||||
|     pub program_runner: ProgramRunner, | ||||
| } | ||||
| 
 | ||||
| type BoxFuture<Output> = Pin<Box<dyn Future<Output = Output>>>; | ||||
| @ -30,6 +32,7 @@ pub enum ErrorCode { | ||||
|     // NotUnique = 110,
 | ||||
|     NoSuchSection = 120, | ||||
|     NoSuchSectionRun = 121, | ||||
|     NoSuchProgram = 122, | ||||
|     Internal = 200, | ||||
|     NotImplemented = 201, | ||||
|     Timeout = 300, | ||||
| @ -258,6 +261,7 @@ pub enum Request { | ||||
|     CancelSection(sections::CancelSectionRequest), | ||||
|     CancelSectionRunId(sections::CancelSectionRunIdRequest), | ||||
|     PauseSectionRunner(sections::PauseSectionRunnerRequest), | ||||
|     RunProgram(programs::RunProgramRequest), | ||||
| } | ||||
| 
 | ||||
| impl IRequest for Request { | ||||
| @ -269,6 +273,7 @@ impl IRequest for Request { | ||||
|             Request::CancelSection(req) => req.exec_erased(ctx), | ||||
|             Request::CancelSectionRunId(req) => req.exec_erased(ctx), | ||||
|             Request::PauseSectionRunner(req) => req.exec_erased(ctx), | ||||
|             Request::RunProgram(req) => req.exec_erased(ctx), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										32
									
								
								src/mqtt/request/programs.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/mqtt/request/programs.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| 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")?, | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user