use std::str;
+use std::sync::{ Arc, Mutex };
use tokio::io::{ AsyncReadExt, AsyncWriteExt };
-use tokio::net::{TcpListener, TcpStream};
+use tokio::net::{ TcpListener, TcpStream };
#[tokio::main]
async fn main() {
+ let balance = Arc::new(Mutex::new(0.0f64));
let listener = TcpListener::bind("127.0.0.1:8181").await.unwrap();
loop {
let (stream, _) = listener.accept().await.unwrap();
- tokio::spawn(async move { handle_connection(stream).await });
+ let balance_ref = balance.clone();
+ tokio::spawn(async move { handle_connection(stream, balance_ref).await });
}
}
-async fn handle_connection(mut stream: TcpStream) {
+async fn handle_connection(mut stream: TcpStream, balance: Arc<Mutex<f64>>) {
// Read the first 16 characters from the incoming stream
let mut buffer = [0; 16];
assert!(stream.read(&mut buffer).await.unwrap() >= 16);
let contents = match method_type {
"GET " => {
- // todo: return real balance
- format!("{{\"balance\": {}}}", 0.0)
+ format!("{{\"balance\": {}}}", balance.lock().unwrap())
}
"POST" => {
// Take characters after 'POST /' until whitespace is detected.
.take_while(|x| **x != 32u8)
.map(|x| *x as char)
.collect();
- let balance_update = input.parse::<f32>().unwrap();
- // todo: add balance update handling
- format!("{{\"balance\": {}}}", balance_update)
+ let balance_update = input.parse::<f64>().unwrap();
+ println!("got POST request to update by {}", balance_update);
+ let mut locked_balance = balance.lock().unwrap();
+ *locked_balance += balance_update;
+ format!("{{\"balance\": {}}}", locked_balance)
}
_ => {
panic!("Invalid HTTP method!")