summaryrefslogtreecommitdiff
path: root/dichroism/src
diff options
context:
space:
mode:
Diffstat (limited to 'dichroism/src')
-rw-r--r--dichroism/src/main.rs77
1 files changed, 67 insertions, 10 deletions
diff --git a/dichroism/src/main.rs b/dichroism/src/main.rs
index 8e97d04..eec1db0 100644
--- a/dichroism/src/main.rs
+++ b/dichroism/src/main.rs
@@ -1,7 +1,7 @@
-use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder};
+use actix_web::{guard, web, App, Either, Error, HttpRequest, HttpResponse, HttpServer, Responder};
use futures::future::{ready, Ready};
use listenfd::ListenFd;
-use serde::Serialize;
+use serde::{Deserialize, Serialize};
#[derive(Serialize)]
struct Product {
@@ -26,20 +26,56 @@ impl Responder for Product {
}
}
-async fn products() -> impl Responder {
- Product {
+#[derive(Deserialize)]
+struct NewProduct {
+ name: String,
+ quantity: i32,
+ cents: u32,
+ img_path: String,
+ description: String,
+}
+
+type ProductResult = Either<HttpResponse, Result<Product, Error>>;
+
+async fn get_single_product(path: web::Path<(u32,)>) -> ProductResult {
+ let id = path.0;
+
+ if id != 1 {
+ Either::A(HttpResponse::BadRequest().body("bad data"))
+ } else {
+ Either::B(Ok(Product {
+ id: 1,
+ name: "Beach Box".to_string(),
+ quantity: 3,
+ cents: 1100,
+ img_path: "/beach_box.jpg".to_string(),
+ description: "It's a beach in a box".to_string(),
+ }))
+ }
+}
+
+async fn get_all_products() -> impl Responder {
+ let product = Product {
id: 1,
name: "Beach Box".to_string(),
quantity: 3,
cents: 1100,
img_path: "/beach_box.jpg".to_string(),
description: "It's a beach in a box".to_string(),
- }
+ };
+
+ web::Json(vec![product])
}
-async fn greet(req: HttpRequest) -> impl Responder {
- let name = req.match_info().get("name").unwrap_or("World");
- format!("Hello {}!", &name)
+async fn create_product(new_product: web::Json<NewProduct>) -> impl Responder {
+ Product {
+ id: 2,
+ name: new_product.name.to_owned(),
+ quantity: new_product.quantity,
+ cents: new_product.cents,
+ img_path: new_product.img_path.to_owned(),
+ description: new_product.description.to_owned(),
+ }
}
async fn index() -> impl Responder {
@@ -52,8 +88,29 @@ async fn main() -> std::io::Result<()> {
let mut server = HttpServer::new(|| {
App::new()
.route("/", web::get().to(index))
- .route("/{name}", web::get().to(greet))
- .route("/products", web::get().to(products))
+ .service(
+ web::resource("/products")
+ .route(
+ web::route()
+ .guard(guard::Get())
+ .guard(guard::Header("content-type", "application/json"))
+ .to(get_all_products),
+ )
+ .route(
+ web::route()
+ .guard(guard::Post())
+ .guard(guard::Header("content-type", "application/json"))
+ .to(create_product),
+ ),
+ )
+ .service(
+ web::resource("/products/{id}").route(
+ web::route()
+ .guard(guard::Get())
+ .guard(guard::Header("content-type", "application/json"))
+ .to(get_single_product),
+ ),
+ )
});
server = if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {