diff --git a/.gitignore b/.gitignore index 0b188bc..e2aab4f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,8 @@ target/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + + +# Added by cargo + +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c836a82 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,107 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rocket-api-rust" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8007d25 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rocket-api-rust" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = {version = "1.0.228", features = ["derive"]} +serde_json = "1.0.149" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e0f038c --- /dev/null +++ b/src/main.rs @@ -0,0 +1,45 @@ +mod models; + +use models::{UpdateState, Event}; + +use std::io::{BufReader, Write}; +use std::net::TcpStream; + +use serde_json::{Deserializer, Value}; + +fn main() { + let _ = read_stream(); +} + +fn handle_data(event: &str, data: Value) { + let inner = data + .as_str() + .unwrap_or_else(|| panic!("Expected Data to be a JSON string, got: {}", data)); + match event { + "UpdateState" => { + let update_data: UpdateState = + serde_json::from_str(inner).expect("Failed to parse UpdateState"); + println!("Ball speed: {:?}", update_data.game.ball.speed); + } + other => println!("Evento desconocido: {}", other), + } +} + +fn read_stream() -> Result<(), Box> { + let mut stream = TcpStream::connect("localhost:49123")?; + + let request = "GET /\r\n"; + stream.write_all(request.as_bytes())?; + + let reader = BufReader::new(stream); + let mut stream_iter = Deserializer::from_reader(reader).into_iter::(); + + while let Some(result) = stream_iter.next() { + match result { + Ok(event) => handle_data(&event.event, event.data), + Err(e) => eprintln!("Error de parseo: {}", e), + } + } + + Ok(()) +} diff --git a/src/models/attacker.rs b/src/models/attacker.rs new file mode 100644 index 0000000..3b213ef --- /dev/null +++ b/src/models/attacker.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Attacker { + #[serde(rename = "Name")] + pub name: String, + + #[serde(rename = "Shortcut")] + pub shortcut: i32, + + #[serde(rename = "TeamNum")] + pub team_num: i32 +} diff --git a/src/models/ball.rs b/src/models/ball.rs new file mode 100644 index 0000000..cd9af46 --- /dev/null +++ b/src/models/ball.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Ball { + #[serde(rename = "Speed")] + pub speed: f64, + + #[serde(rename = "TeamNum")] + pub team_num: i32, +} diff --git a/src/models/event.rs b/src/models/event.rs new file mode 100644 index 0000000..188fb2b --- /dev/null +++ b/src/models/event.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize}; +use serde_json::{Value}; + +#[derive(Deserialize)] +pub struct Event { + #[serde(rename = "Event")] + pub event: String, + #[serde(rename = "Data")] + pub data: Value, +} diff --git a/src/models/game.rs b/src/models/game.rs new file mode 100644 index 0000000..8c0be88 --- /dev/null +++ b/src/models/game.rs @@ -0,0 +1,44 @@ +use serde::{Deserialize, Serialize}; + +use super::team::Team; +use super::ball::Ball; +use super::target::Target; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Game { + #[serde(rename = "Teams")] + pub teams: Vec, + + #[serde(rename = "TimeSeconds")] + pub time_seconds: i32, + + #[serde(rename = "bOvertime")] + pub b_overtime: bool, + + #[serde(rename = "Ball")] + pub ball: Ball, + + #[serde(rename = "bReplay")] + pub b_replay: bool, + + #[serde(rename = "bHasWinner")] + pub b_has_winner: bool, + + #[serde(rename = "Winner")] + pub winner: String, + + #[serde(rename = "Arena")] + pub arena: String, + + #[serde(rename = "bHasTarget")] + pub b_has_target: bool, + + #[serde(rename = "Target")] + pub target: Option, + + #[serde(rename = "Frame")] + pub frame: Option, + + #[serde(rename = "Elapsed")] + pub elapsed: Option, +} diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 0000000..eb6cd65 --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1,14 @@ +pub mod player; +pub mod team; +pub mod ball; +pub mod target; +pub mod game; +pub mod event; +pub mod update_state; +pub mod attacker; + +pub use player::Player; +pub use attacker::Attacker; +pub use game::Game; +pub use update_state::UpdateState; +pub use event::Event; diff --git a/src/models/player.rs b/src/models/player.rs new file mode 100644 index 0000000..f181351 --- /dev/null +++ b/src/models/player.rs @@ -0,0 +1,74 @@ +use serde::{Deserialize, Serialize}; + +use super::Attacker; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Player { + #[serde(rename = "Name")] + pub name: String, + + #[serde(rename = "PrimaryId")] + pub primary_id: String, + + #[serde(rename = "Shortcut")] + pub shortcut: i32, + + #[serde(rename = "TeamNum")] + pub team_num: i32, + + #[serde(rename = "Score")] + pub score: i32, + + #[serde(rename = "Goals")] + pub goals: i32, + + #[serde(rename = "Shots")] + pub shots: i32, + + #[serde(rename = "Assists")] + pub assists: i32, + + #[serde(rename = "Saves")] + pub saves: i32, + + #[serde(rename = "Touches")] + pub touches: i32, + + #[serde(rename = "CarTouches")] + pub car_touches: i32, + + #[serde(rename = "Demos")] + pub demos: i32, + + // Conditional + + #[serde(rename = "Boost")] + pub boost: Option, + + #[serde(rename = "bBoosting")] + pub b_boosting: Option, + + #[serde(rename = "bOnGround")] + pub b_on_ground: Option, + + #[serde(rename = "bOnWall")] + pub b_on_wall: Option, + + #[serde(rename = "bHasCar")] + pub b_has_car: Option, + + #[serde(rename = "Speed")] + pub speed: Option, + + #[serde(rename = "bPowersliding")] + pub b_power_sliding: Option, + + #[serde(rename = "bDemolished")] + pub b_demolished: Option, + + #[serde(rename = "bSupersonic")] + pub b_supersonic: Option, + + #[serde(rename = "Attacker")] + pub attacker: Option +} diff --git a/src/models/target.rs b/src/models/target.rs new file mode 100644 index 0000000..4dd5529 --- /dev/null +++ b/src/models/target.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Target { + #[serde(rename = "Name")] + pub name: String, + + #[serde(rename = "Shortcut")] + pub shortcut: i32, + + #[serde(rename = "TeamNum")] + pub team_num: i32, +} diff --git a/src/models/team.rs b/src/models/team.rs new file mode 100644 index 0000000..488bbfc --- /dev/null +++ b/src/models/team.rs @@ -0,0 +1,19 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Team { + #[serde(rename = "Name")] + pub name: String, + + #[serde(rename = "TeamNum")] + pub team_num: i32, + + #[serde(rename = "Score")] + pub score: i32, + + #[serde(rename = "ColorPrimary")] + pub color_primary: String, + + #[serde(rename = "ColorSecondary")] + pub color_secondary: String, +} diff --git a/src/models/update_state.rs b/src/models/update_state.rs new file mode 100644 index 0000000..4857ac5 --- /dev/null +++ b/src/models/update_state.rs @@ -0,0 +1,16 @@ +use serde::{Deserialize, Serialize}; + +use super::{Game, Player}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +// #[serde(rename_all = "camelCase")] // Opcional, pero ayuda si hay variaciones de nombres +pub struct UpdateState { + #[serde(rename = "MatchGuid")] + pub match_guid: String, + + #[serde(rename = "Players")] + pub players: Vec, + + #[serde(rename = "Game")] + pub game: Game, +}