mirror of
https://github.com/rjNemo/rust-web
synced 2026-06-06 02:46:41 +00:00
mutable state
This commit is contained in:
parent
59d782990c
commit
78e8ea4aa4
3 changed files with 27 additions and 23 deletions
37
src/main.rs
37
src/main.rs
|
|
@ -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;
|
use env_logger::Env;
|
||||||
|
|
||||||
mod task;
|
mod task;
|
||||||
|
|
@ -9,23 +9,26 @@ mod task;
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
async fn main() -> std::io::Result<()> {
|
async fn main() -> std::io::Result<()> {
|
||||||
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
|
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()
|
App::new()
|
||||||
.wrap(middleware::Logger::default())
|
.wrap(middleware::Logger::default())
|
||||||
.data(task::TaskList {
|
.app_data(tasks.clone())
|
||||||
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,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
.configure(task::init)
|
.configure(task::init)
|
||||||
})
|
})
|
||||||
.bind("127.0.0.1:8000")?
|
.bind("127.0.0.1:8000")?
|
||||||
|
|
|
||||||
|
|
@ -29,17 +29,17 @@ async fn get_task(
|
||||||
web::Path(id): web::Path<usize>,
|
web::Path(id): web::Path<usize>,
|
||||||
data: web::Data<TaskList>,
|
data: web::Data<TaskList>,
|
||||||
) -> Result<HttpResponse> {
|
) -> Result<HttpResponse> {
|
||||||
let task = &data.tasks[id];
|
let task = &data.tasks.lock().unwrap()[id];
|
||||||
Ok(HttpResponse::Ok().json(task))
|
Ok(HttpResponse::Ok().json(task))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates and stores a new `Task`
|
/// Creates and stores a new `Task`
|
||||||
#[post("/")]
|
#[post("/")]
|
||||||
async fn add_task(form: web::Form<NewTask>, data: web::Data<TaskList>) -> Result<HttpResponse> {
|
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());
|
let new_task = Task::new(id, form.title.clone());
|
||||||
// data.tasks.push(new_task);
|
data.tasks.lock().unwrap().push(new_task);
|
||||||
Ok(HttpResponse::Ok().json(new_task))
|
Ok(HttpResponse::Ok().status(StatusCode::CREATED).json(id))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Closes the given task if open, otherwise return an bad request
|
/// 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>,
|
web::Path(id): web::Path<usize>,
|
||||||
data: web::Data<TaskList>,
|
data: web::Data<TaskList>,
|
||||||
) -> Result<HttpResponse> {
|
) -> Result<HttpResponse> {
|
||||||
let task = &data.tasks[id];
|
let task = &data.tasks.lock().unwrap()[id];
|
||||||
if task.is_completed {
|
if task.is_completed {
|
||||||
Ok(HttpResponse::new(StatusCode::BAD_REQUEST))
|
Ok(HttpResponse::new(StatusCode::BAD_REQUEST))
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
/// Task model
|
/// Task model
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
|
|
@ -39,5 +40,5 @@ pub struct NewTask {
|
||||||
/// The actual task container.
|
/// The actual task container.
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
pub struct TaskList {
|
pub struct TaskList {
|
||||||
pub tasks: Vec<Task>,
|
pub tasks: Mutex<Vec<Task>>,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue