Start adding state manager interface
This commit is contained in:
		
							parent
							
								
									1abdad7113
								
							
						
					
					
						commit
						898f5c7580
					
				| @ -14,6 +14,7 @@ tracing = "0.1.19" | ||||
| chrono = { version = "0.4.15" } | ||||
| serde = { version = "1.0.116", features = ["derive"] } | ||||
| im = "15.0.0" | ||||
| eyre = "0.6.0" | ||||
| 
 | ||||
| [dependencies.tokio] | ||||
| version = "0.2.22" | ||||
|  | ||||
| @ -1,8 +1,10 @@ | ||||
| pub mod program_runner; | ||||
| pub mod section_runner; | ||||
| pub mod state_manager; | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod trace_listeners; | ||||
| 
 | ||||
| pub use program_runner::ProgramRunner; | ||||
| pub use section_runner::SectionRunner; | ||||
| pub use state_manager::StateManager; | ||||
|  | ||||
							
								
								
									
										50
									
								
								sprinklers_actors/src/state_manager.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								sprinklers_actors/src/state_manager.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| use eyre::Result; | ||||
| use sprinklers_core::model::{ProgramId, ProgramRef, ProgramUpdateData, Programs}; | ||||
| use tokio::sync::{mpsc, oneshot, watch}; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub enum Request { | ||||
|     UpdateProgram { | ||||
|         id: ProgramId, | ||||
|         update: ProgramUpdateData, | ||||
|         resp_tx: oneshot::Sender<Result<ProgramRef>>, | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| #[derive(Clone)] | ||||
| pub struct StateManager { | ||||
|     request_tx: mpsc::Sender<Request>, | ||||
|     programs_watch: watch::Receiver<Programs>, | ||||
| } | ||||
| 
 | ||||
| impl StateManager { | ||||
|     pub fn new( | ||||
|         request_tx: mpsc::Sender<Request>, | ||||
|         programs_watch: watch::Receiver<Programs>, | ||||
|     ) -> Self { | ||||
|         Self { | ||||
|             request_tx, | ||||
|             programs_watch, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub async fn update_program( | ||||
|         &mut self, | ||||
|         id: ProgramId, | ||||
|         update: ProgramUpdateData, | ||||
|     ) -> Result<ProgramRef> { | ||||
|         let (resp_tx, resp_rx) = oneshot::channel(); | ||||
|         self.request_tx | ||||
|             .send(Request::UpdateProgram { | ||||
|                 id, | ||||
|                 update, | ||||
|                 resp_tx, | ||||
|             }) | ||||
|             .await?; | ||||
|         resp_rx.await? | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_programs(&self) -> watch::Receiver<Programs> { | ||||
|         self.programs_watch.clone() | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user