Update backend protocol, skeleton backend project

This commit is contained in:
Stephen Seo 2022-03-16 12:26:18 +09:00
parent 78521f683e
commit 7c4d38549f
5 changed files with 98 additions and 2 deletions

1
back_end/Cargo.lock generated
View file

@ -133,6 +133,7 @@ dependencies = [
name = "four_line_dropper_backend"
version = "0.1.0"
dependencies = [
"serde_json",
"tokio",
"warp",
]

View file

@ -8,3 +8,4 @@ edition = "2021"
[dependencies]
tokio = { version = "1", features = ["full"] }
warp = "0.3"
serde_json = "1.0"

View file

@ -0,0 +1,48 @@
use serde_json::Value;
pub fn handle_json(root: Value) -> Result<String, String> {
if let Some(Value::String(type_str)) = root.get("type") {
match type_str.as_str() {
"pairing_request" => handle_pairing_request(root),
"check_pairing" => handle_check_pairing(root),
"place_token" => handle_place_token(root),
"whose_turn" => handle_whose_turn(root),
"disconnect" => handle_disconnect(root),
"request_board_state" => handle_request_board_state(root),
"game_state" => handle_game_state(root),
_ => {
Err("{\"type\":\"invalid_type\"}".into())
}
}
} else {
Err("{\"type\":\"invalid_json\"}".into())
}
}
fn handle_pairing_request(root: Value) -> Result<String, String> {
Err("{\"type\":\"unimplemented\"}".into())
}
fn handle_check_pairing(root: Value) -> Result<String, String> {
Err("{\"type\":\"unimplemented\"}".into())
}
fn handle_place_token(root: Value) -> Result<String, String> {
Err("{\"type\":\"unimplemented\"}".into())
}
fn handle_whose_turn(root: Value) -> Result<String, String> {
Err("{\"type\":\"unimplemented\"}".into())
}
fn handle_disconnect(root: Value) -> Result<String, String> {
Err("{\"type\":\"unimplemented\"}".into())
}
fn handle_request_board_state(root: Value) -> Result<String, String> {
Err("{\"type\":\"unimplemented\"}".into())
}
fn handle_game_state(root: Value) -> Result<String, String> {
Err("{\"type\":\"unimplemented\"}".into())
}

View file

@ -1,3 +1,24 @@
fn main() {
println!("Hello, world!");
mod json_handlers;
use serde_json::Value;
use warp::Filter;
#[tokio::main]
async fn main() {
let route = warp::body::content_length_limit(1024 * 32)
.and(warp::body::json())
.map(|json_value: Value| {
let result = json_handlers::handle_json(json_value);
if let Ok(result_str) = result {
result_str
} else if let Err(error_str) = result {
error_str
} else {
unreachable!()
}
});
warp::serve(route)
.run(([0,0,0,0], 1237))
.await;
}

View file

@ -199,3 +199,28 @@ of "opponent\_disconnected". Future requests will return "unknown\_id".
"status": "opponent_disconnected", // or "unknown_id"
}
```
8. Failure Response
When request "type" is not handled by the back-end, it returns with
"invalid\_type".
```
{
"type": "invalid_type"
}
```
When JSON is missing a required value, it returns with "invalid\_json".
```
{
"type": "invalid_json"
}
```
When the back-end hasn't yet implemented handling a specific type, it returns
"unimplemented".
```
{
"type": "unimplemented"
}
```