Un inicio
Meter primero crossterm y luego probar con imgui y mas cosas
This commit is contained in:
45
src/main.rs
Normal file
45
src/main.rs
Normal file
@@ -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<dyn std::error::Error>> {
|
||||
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::<Event>();
|
||||
|
||||
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(())
|
||||
}
|
||||
13
src/models/attacker.rs
Normal file
13
src/models/attacker.rs
Normal file
@@ -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
|
||||
}
|
||||
10
src/models/ball.rs
Normal file
10
src/models/ball.rs
Normal file
@@ -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,
|
||||
}
|
||||
10
src/models/event.rs
Normal file
10
src/models/event.rs
Normal file
@@ -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,
|
||||
}
|
||||
44
src/models/game.rs
Normal file
44
src/models/game.rs
Normal file
@@ -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<Team>,
|
||||
|
||||
#[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<Target>,
|
||||
|
||||
#[serde(rename = "Frame")]
|
||||
pub frame: Option<i32>,
|
||||
|
||||
#[serde(rename = "Elapsed")]
|
||||
pub elapsed: Option<f64>,
|
||||
}
|
||||
14
src/models/mod.rs
Normal file
14
src/models/mod.rs
Normal file
@@ -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;
|
||||
74
src/models/player.rs
Normal file
74
src/models/player.rs
Normal file
@@ -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<i32>,
|
||||
|
||||
#[serde(rename = "bBoosting")]
|
||||
pub b_boosting: Option<bool>,
|
||||
|
||||
#[serde(rename = "bOnGround")]
|
||||
pub b_on_ground: Option<bool>,
|
||||
|
||||
#[serde(rename = "bOnWall")]
|
||||
pub b_on_wall: Option<bool>,
|
||||
|
||||
#[serde(rename = "bHasCar")]
|
||||
pub b_has_car: Option<bool>,
|
||||
|
||||
#[serde(rename = "Speed")]
|
||||
pub speed: Option<f64>,
|
||||
|
||||
#[serde(rename = "bPowersliding")]
|
||||
pub b_power_sliding: Option<bool>,
|
||||
|
||||
#[serde(rename = "bDemolished")]
|
||||
pub b_demolished: Option<bool>,
|
||||
|
||||
#[serde(rename = "bSupersonic")]
|
||||
pub b_supersonic: Option<bool>,
|
||||
|
||||
#[serde(rename = "Attacker")]
|
||||
pub attacker: Option<Attacker>
|
||||
}
|
||||
13
src/models/target.rs
Normal file
13
src/models/target.rs
Normal file
@@ -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,
|
||||
}
|
||||
19
src/models/team.rs
Normal file
19
src/models/team.rs
Normal file
@@ -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,
|
||||
}
|
||||
16
src/models/update_state.rs
Normal file
16
src/models/update_state.rs
Normal file
@@ -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<Player>,
|
||||
|
||||
#[serde(rename = "Game")]
|
||||
pub game: Game,
|
||||
}
|
||||
Reference in New Issue
Block a user