diff --git a/back_end/Cargo.lock b/back_end/Cargo.lock index b6bfcc7..93786c0 100644 --- a/back_end/Cargo.lock +++ b/back_end/Cargo.lock @@ -133,6 +133,7 @@ dependencies = [ name = "four_line_dropper_backend" version = "0.1.0" dependencies = [ + "serde_json", "tokio", "warp", ] diff --git a/back_end/Cargo.toml b/back_end/Cargo.toml index 3dd1016..dc40e30 100644 --- a/back_end/Cargo.toml +++ b/back_end/Cargo.toml @@ -8,3 +8,4 @@ edition = "2021" [dependencies] tokio = { version = "1", features = ["full"] } warp = "0.3" +serde_json = "1.0" diff --git a/back_end/src/json_handlers.rs b/back_end/src/json_handlers.rs new file mode 100644 index 0000000..4a3ee17 --- /dev/null +++ b/back_end/src/json_handlers.rs @@ -0,0 +1,48 @@ +use serde_json::Value; + +pub fn handle_json(root: Value) -> Result { + 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 { + Err("{\"type\":\"unimplemented\"}".into()) +} + +fn handle_check_pairing(root: Value) -> Result { + Err("{\"type\":\"unimplemented\"}".into()) +} + +fn handle_place_token(root: Value) -> Result { + Err("{\"type\":\"unimplemented\"}".into()) +} + +fn handle_whose_turn(root: Value) -> Result { + Err("{\"type\":\"unimplemented\"}".into()) +} + +fn handle_disconnect(root: Value) -> Result { + Err("{\"type\":\"unimplemented\"}".into()) +} + +fn handle_request_board_state(root: Value) -> Result { + Err("{\"type\":\"unimplemented\"}".into()) +} + +fn handle_game_state(root: Value) -> Result { + Err("{\"type\":\"unimplemented\"}".into()) +} diff --git a/back_end/src/main.rs b/back_end/src/main.rs index e7a11a9..ee63d03 100644 --- a/back_end/src/main.rs +++ b/back_end/src/main.rs @@ -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; } diff --git a/backend_protocol_specification.md b/backend_protocol_specification.md index b431433..1516eb1 100644 --- a/backend_protocol_specification.md +++ b/backend_protocol_specification.md @@ -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" + } +```