Un inicio

Meter primero crossterm y luego probar con imgui y mas cosas
This commit is contained in:
Ruben Garcalia
2026-05-16 22:36:34 +02:00
parent 27dbf2fa3c
commit 9ce7217d6b
13 changed files with 378 additions and 0 deletions

45
src/main.rs Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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,
}

View 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,
}