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 { |     let request_context = mqtt::RequestContext { | ||||||
|         sections: sections.clone(), |         sections: sections.clone(), | ||||||
|         section_runner: section_runner.clone(), |         section_runner: section_runner.clone(), | ||||||
|  |         program_runner: program_runner.clone(), | ||||||
|     }; |     }; | ||||||
|     let mut mqtt_interface = mqtt::MqttInterfaceTask::start(mqtt_options, request_context); |     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::ready; | ||||||
| use futures_util::FutureExt; | use futures_util::FutureExt; | ||||||
| @ -6,11 +6,13 @@ use num_derive::FromPrimitive; | |||||||
| use serde::{Deserialize, Serialize}; | use serde::{Deserialize, Serialize}; | ||||||
| use std::{fmt, future::Future, pin::Pin, task::Poll}; | use std::{fmt, future::Future, pin::Pin, task::Poll}; | ||||||
| 
 | 
 | ||||||
|  | mod programs; | ||||||
| mod sections; | mod sections; | ||||||
| 
 | 
 | ||||||
| pub struct RequestContext { | pub struct RequestContext { | ||||||
|     pub sections: Sections, |     pub sections: Sections, | ||||||
|     pub section_runner: SectionRunner, |     pub section_runner: SectionRunner, | ||||||
|  |     pub program_runner: ProgramRunner, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type BoxFuture<Output> = Pin<Box<dyn Future<Output = Output>>>; | type BoxFuture<Output> = Pin<Box<dyn Future<Output = Output>>>; | ||||||
| @ -30,6 +32,7 @@ pub enum ErrorCode { | |||||||
|     // NotUnique = 110,
 |     // NotUnique = 110,
 | ||||||
|     NoSuchSection = 120, |     NoSuchSection = 120, | ||||||
|     NoSuchSectionRun = 121, |     NoSuchSectionRun = 121, | ||||||
|  |     NoSuchProgram = 122, | ||||||
|     Internal = 200, |     Internal = 200, | ||||||
|     NotImplemented = 201, |     NotImplemented = 201, | ||||||
|     Timeout = 300, |     Timeout = 300, | ||||||
| @ -258,6 +261,7 @@ pub enum Request { | |||||||
|     CancelSection(sections::CancelSectionRequest), |     CancelSection(sections::CancelSectionRequest), | ||||||
|     CancelSectionRunId(sections::CancelSectionRunIdRequest), |     CancelSectionRunId(sections::CancelSectionRunIdRequest), | ||||||
|     PauseSectionRunner(sections::PauseSectionRunnerRequest), |     PauseSectionRunner(sections::PauseSectionRunnerRequest), | ||||||
|  |     RunProgram(programs::RunProgramRequest), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl IRequest for Request { | impl IRequest for Request { | ||||||
| @ -269,6 +273,7 @@ impl IRequest for Request { | |||||||
|             Request::CancelSection(req) => req.exec_erased(ctx), |             Request::CancelSection(req) => req.exec_erased(ctx), | ||||||
|             Request::CancelSectionRunId(req) => req.exec_erased(ctx), |             Request::CancelSectionRunId(req) => req.exec_erased(ctx), | ||||||
|             Request::PauseSectionRunner(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