summaryrefslogtreecommitdiff
path: root/dichroism/src/main.rs
blob: 8e97d04e2b1af5aba449e8656bee9f1ce90c8cfb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder};
use futures::future::{ready, Ready};
use listenfd::ListenFd;
use serde::Serialize;

#[derive(Serialize)]
struct Product {
    id: u32,
    name: String,
    quantity: i32,
    cents: u32,
    img_path: String,
    description: String,
}

impl Responder for Product {
    type Error = Error;
    type Future = Ready<Result<HttpResponse, Error>>;

    fn respond_to(self, _req: &HttpRequest) -> Self::Future {
        let body = serde_json::to_string(&self).unwrap();

        ready(Ok(HttpResponse::Ok()
            .content_type("application/json")
            .body(body)))
    }
}

async fn products() -> impl Responder {
    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 greet(req: HttpRequest) -> impl Responder {
    let name = req.match_info().get("name").unwrap_or("World");
    format!("Hello {}!", &name)
}

async fn index() -> impl Responder {
    "Hello, this is an API. If you're looking for the web app, try the top-level domain at port 443.".to_string()
}

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    let mut listenfd = ListenFd::from_env();
    let mut server = HttpServer::new(|| {
        App::new()
            .route("/", web::get().to(index))
            .route("/{name}", web::get().to(greet))
            .route("/products", web::get().to(products))
    });

    server = if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
        server.listen(l)?
    } else {
        server.bind("127.0.0.1:8000")?
    };
    server.run().await
}