-
-
Notifications
You must be signed in to change notification settings - Fork 221
/
Copy pathmain.rs
97 lines (91 loc) · 3.2 KB
/
main.rs
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use salvo::macros::Extractible;
use salvo::prelude::*;
use serde::{Deserialize, Serialize};
#[handler]
async fn show(req: &mut Request, res: &mut Response) {
let content = format!(
r#"<!DOCTYPE html>
<html>
<head>
<title>Parse data</title>
</head>
<body>
<h1>Hello, fill your profile</h1>
<div id="result"></div>
<form id="form" method="post">
<label>First Name:</label><input type="text" name="first_name" />
<label>Last Name:</label><input type="text" name="last_name" />
<legend>What is Your Favorite Pet?</legend>
<input type="checkbox" name="lovers" value="Cats">Cats<br>
<input type="checkbox" name="lovers" value="Dogs">Dogs<br>
<input type="checkbox" name="lovers" value="Birds">Birds<br>
<input type="submit" value="Submit" />
</form>
<script>
let form = document.getElementById("form");
form.addEventListener("submit", async (e) => {{
e.preventDefault();
let response = await fetch('/{}?username=jobs', {{
method: 'POST',
headers: {{
'Content-Type': 'application/json',
}},
body: JSON.stringify({{
first_name: form.querySelector("input[name='first_name']").value,
last_name: form.querySelector("input[name='last_name']").value,
lovers: Array.from(form.querySelectorAll("input[name='lovers']:checked")).map(el => el.value),
}}),
}});
let text = await response.text();
document.getElementById("result").innerHTML = text;
}});
</script>
</body>
</html>
"#,
req.params().get("id").unwrap()
);
res.render(Text::Html(content));
}
#[handler]
async fn edit<'a>(good_man: GoodMan<'a>, res: &mut Response) {
res.render(Json(good_man));
}
#[derive(Serialize, Deserialize, Extractible, Debug)]
#[salvo(extract(default_source(from = "body")))]
struct GoodMan<'a> {
#[salvo(extract(source(from = "param")))]
#[serde(default)]
id: i64,
#[salvo(extract(source(from = "query")))]
#[serde(default)]
username: &'a str,
first_name: String,
last_name: String,
lovers: Vec<String>,
#[salvo(extract(flatten))]
nested: Nested<'a>,
}
#[derive(Serialize, Deserialize, Extractible, Debug)]
#[salvo(extract(default_source(from = "body")))]
struct Nested<'a> {
#[salvo(extract(source(from = "param")))]
#[serde(default)]
id: i64,
#[salvo(extract(source(from = "query")))]
#[serde(default)]
username: &'a str,
first_name: String,
last_name: String,
#[salvo(rename = "lovers")]
#[serde(default)]
pets: Vec<String>,
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt().init();
let router = Router::with_path("{id}").get(show).post(edit);
println!("Example url: http://0.0.0.0:5800/95");
let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
Server::new(acceptor).serve(router).await;
}