Skip to content

Instantly share code, notes, and snippets.

@d3v3us
Created February 6, 2021 19:49
Show Gist options
  • Select an option

  • Save d3v3us/a9edd2385037261759474d3cb3874ac7 to your computer and use it in GitHub Desktop.

Select an option

Save d3v3us/a9edd2385037261759474d3cb3874ac7 to your computer and use it in GitHub Desktop.
use actix_web::{web, App, HttpResponse, Responder,HttpServer,middleware};
use serde::{ Serialize};
use std::cell::Cell;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Mutex};
pub struct MessageApp {
host: String,
port: u16,
}
#[derive(Serialize)]
struct IndexResponse {
server_id: usize,
request_count: usize,
messages: Vec<String>,
}
struct AppState {
server_id: usize,
request_count: Cell<usize>,
messages: Arc<Mutex<Vec<String>>>,
}
static SERVER_COUNTER: AtomicUsize = AtomicUsize::new(0);
pub fn index(state: web::Data<Mutex<AppState>>) -> impl Responder {
let state = state.lock().unwrap();
let request_count = state.request_count.get() + 1;
state.request_count.set(request_count);
let ms = state.messages.lock().unwrap();
HttpResponse::Ok().json(IndexResponse {
server_id: state.server_id,
request_count,
messages: ms.clone(),
})
}
impl MessageApp {
pub fn new(host: String, port: u16) -> Self {
MessageApp { host, port }
}
pub async fn run(&self) -> std::io::Result<()> {
println!("Starting http server: {}:{}", self.host, self.port);
let messages = Arc::new(Mutex::new(vec![]));
HttpServer::new(move || {
App::new()
// .service(
// web::scope("/app/messages")
// .wrap(middleware::Logger::default())
// .route("/", web::get().to(MessageApp::index)),
// )
.data(AppState {
server_id: SERVER_COUNTER.fetch_add(1, Ordering::SeqCst),
request_count: Cell::new(0),
messages: messages.clone(),
})
.wrap(middleware::Logger::default())
.service(web::resource("/").route(web::get().to(index)))
})
.workers(8)
.bind((self.host.clone(), self.port))?
.run()
.await
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment