mutable state

This commit is contained in:
Ruidy 2020-12-30 01:57:26 +01:00
parent 59d782990c
commit 78e8ea4aa4
3 changed files with 27 additions and 23 deletions

View file

@ -1,6 +1,6 @@
// #![deny(missing_docs)]
use std::sync::Mutex;
use actix_web::{middleware, App, HttpServer};
use actix_web::{middleware, web, App, HttpServer};
use env_logger::Env;
mod task;
@ -9,23 +9,26 @@ mod task;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
HttpServer::new(|| {
let tasks = web::Data::new(task::TaskList {
tasks: Mutex::new(vec![
task::Task {
id: 0,
title: "Learn Rust".to_string(),
is_completed: true,
},
task::Task {
id: 1,
title: "Learn Actix".to_string(),
is_completed: false,
},
]),
});
HttpServer::new(move || {
App::new()
.wrap(middleware::Logger::default())
.data(task::TaskList {
tasks: vec![
task::Task {
id: 0,
title: "Learn Rust".to_string(),
is_completed: false,
},
task::Task {
id: 1,
title: "Learn Actix".to_string(),
is_completed: false,
},
],
})
.app_data(tasks.clone())
.configure(task::init)
})
.bind("127.0.0.1:8000")?

View file

@ -29,17 +29,17 @@ async fn get_task(
web::Path(id): web::Path<usize>,
data: web::Data<TaskList>,
) -> Result<HttpResponse> {
let task = &data.tasks[id];
let task = &data.tasks.lock().unwrap()[id];
Ok(HttpResponse::Ok().json(task))
}
/// Creates and stores a new `Task`
#[post("/")]
async fn add_task(form: web::Form<NewTask>, data: web::Data<TaskList>) -> Result<HttpResponse> {
let id = data.tasks.len();
let id = data.tasks.lock().unwrap().len();
let new_task = Task::new(id, form.title.clone());
// data.tasks.push(new_task);
Ok(HttpResponse::Ok().json(new_task))
data.tasks.lock().unwrap().push(new_task);
Ok(HttpResponse::Ok().status(StatusCode::CREATED).json(id))
}
/// Closes the given task if open, otherwise return an bad request
@ -48,7 +48,7 @@ async fn close_task(
web::Path(id): web::Path<usize>,
data: web::Data<TaskList>,
) -> Result<HttpResponse> {
let task = &data.tasks[id];
let task = &data.tasks.lock().unwrap()[id];
if task.is_completed {
Ok(HttpResponse::new(StatusCode::BAD_REQUEST))
} else {

View file

@ -1,4 +1,5 @@
use serde::{Deserialize, Serialize};
use std::sync::Mutex;
/// Task model
#[derive(Serialize, Deserialize)]
@ -39,5 +40,5 @@ pub struct NewTask {
/// The actual task container.
#[derive(Serialize, Deserialize)]
pub struct TaskList {
pub tasks: Vec<Task>,
pub tasks: Mutex<Vec<Task>>,
}