Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.23 KB | None | 0 0
  1. use tokio::{
  2.     sync::{mpsc, oneshot},
  3.     task,
  4. };
  5.  
  6. #[derive(Debug)]
  7. pub enum QueryAction {
  8.     Test(String),
  9. }
  10. #[derive(Debug)]
  11. pub enum QueryResponse {
  12.     Test(String),
  13. }
  14. #[derive(Debug)]
  15. pub struct Query {
  16.     pub action: QueryAction,
  17.     pub return_channel: oneshot::Sender<QueryResponse>,
  18. }
  19.  
  20. #[derive(Clone)]
  21. pub struct Sender(mpsc::Sender<Query>);
  22. impl Sender {
  23.     pub async fn query(&mut self, string: String) -> QueryResponse {
  24.         let (sender, receiver) = oneshot::channel();
  25.  
  26.         let action = QueryAction::Test(string);
  27.  
  28.         println!("sending query: {:?}", action);
  29.  
  30.         self.0
  31.             .send(Query {
  32.                 action,
  33.                 return_channel: sender,
  34.             })
  35.             .await
  36.             .expect("Failed to send query");
  37.  
  38.         let result = receiver
  39.             .await
  40.             .expect("Failed to recieve query response from return channel");
  41.  
  42.         result
  43.     }
  44. }
  45.  
  46. pub struct Receiver(mpsc::Receiver<Query>);
  47. impl Receiver {
  48.     pub async fn handle(mut self) {
  49.         while let Some(query) = self.0.recv().await {
  50.             println!("got query = {:?}", query.action);
  51.  
  52.             // TODO: read to / write from file
  53.  
  54.             let result = match query.action {
  55.                 QueryAction::Test(inner) => inner.to_uppercase(),
  56.             };
  57.  
  58.             let response = QueryResponse::Test(result);
  59.  
  60.             query
  61.                 .return_channel
  62.                 .send(response)
  63.                 .expect("Tried to send to closed return channel");
  64.         }
  65.     }
  66. }
  67.  
  68. pub fn create_db() -> (Sender, Receiver) {
  69.     let (sender, receiver): (mpsc::Sender<Query>, mpsc::Receiver<Query>) = mpsc::channel(32);
  70.  
  71.     (Sender(sender), Receiver(receiver))
  72. }
  73.  
  74. #[macro_use]
  75. extern crate lazy_static;
  76. lazy_static! {
  77.     pub static ref SENDER: Sender = {
  78.         let (sender, receiver) = create_db();
  79.  
  80.         task::spawn(receiver.handle());
  81.  
  82.         sender
  83.     };
  84. }
  85.  
  86. #[tokio::main]
  87. async fn main() {
  88.     for i in 0..16 {
  89.         let mut sender = SENDER.clone();
  90.         task::spawn(async move {
  91.             let result = sender.query(format!("Query no. {}", i)).await;
  92.  
  93.             println!("result: {:?}", result);
  94.         });
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement