Advertisement
Guest User

Untitled

a guest
Aug 19th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. #![feature(async_await)]
  2.  
  3. use std::path::PathBuf;
  4.  
  5. use tokio;
  6. use tokio::codec::{Framed, LinesCodec};
  7. use tokio::net::TcpListener;
  8. use tokio::prelude::*;
  9.  
  10. use slog::Drain;
  11. use slog::{error, info, o};
  12. use slog_async;
  13. use slog_term;
  14.  
  15. use rocksdb::DB;
  16.  
  17. use blob::BlobServer;
  18.  
  19. #[tokio::main]
  20. async fn main() -> Result<(), Box<dyn std::error::Error>> {
  21. let decorator = slog_term::TermDecorator::new().stderr().build();
  22. let drain = slog_term::CompactFormat::new(decorator).build().fuse();
  23. let drain = slog_async::Async::new(drain).build().fuse();
  24. let log = slog::Logger::root(drain, o!("version" => env!("CARGO_PKG_VERSION")));
  25.  
  26. let addr = "127.0.0.1:8080".parse().unwrap();
  27. let mut listener = TcpListener::bind(&addr)?;
  28. info!(log, "Listening on: {}", addr);
  29.  
  30. info!(log, "initializing");
  31. let kv = DB::open_default(PathBuf::from("/Users/dialtone/dev/rust/blob/db")).unwrap();
  32.  
  33. // Have to use an Arc here unfortunately
  34. let db = std::sync::Arc::new(BlobServer::new(log.clone(), kv));
  35.  
  36. loop {
  37. match listener.accept().await {
  38. Ok((socket, _)) => {
  39. // And here I clone stuff from the Arc or from the log that implements Clone
  40. let logc = log.clone();
  41. let dbc = db.clone();
  42.  
  43. tokio::spawn(async move {
  44. let mut lines = Framed::new(socket, LinesCodec::new());
  45.  
  46. while let Some(result) = lines.next().await {
  47. match result {
  48. Ok(line) => match dbc.handle_request(&line) {
  49. Ok(resp) => {
  50. let response = resp.serialize();
  51. if let Err(e) = lines.send(response).await {
  52. error!(logc, "error on sending response; error = {:?}", e);
  53. }
  54. }
  55. Err(e) => {
  56. error!(logc, "error on processing the request; error = {:?}", e)
  57. }
  58. },
  59. Err(e) => {
  60. error!(logc, "error on decoding from socket; error = {:?}", e);
  61. }
  62. }
  63. }
  64. });
  65. }
  66. Err(e) => error!(log, "error accepting socket; error = {:?}", e),
  67. }
  68. }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement