From 765573d5f4467a7a0431dd153abda2aa99124894 Mon Sep 17 00:00:00 2001 From: Cutieguwu Date: Tue, 25 Mar 2025 18:04:31 -0400 Subject: [PATCH] Add support for recording "TerrainState::In" and GameRecord version support system. --- src/gamelog.rs | 25 +++++++++++++++++++++---- src/main.rs | 18 ++++++++++++++---- templates/logfile.ron | 2 +- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/gamelog.rs b/src/gamelog.rs index 83fa3f9..a707a54 100644 --- a/src/gamelog.rs +++ b/src/gamelog.rs @@ -1,5 +1,8 @@ +use semver; use serde::Deserialize; -use std::{fmt, fs::File}; +use std::{fmt, fs::File, u64}; + +pub const GAMELOG_MIN_VER: semver::Version = semver::Version::new(0, 2, 0); #[derive(Debug, Deserialize)] pub struct LogFile(Vec); @@ -12,6 +15,20 @@ impl TryFrom for LogFile { } } +impl LogFile { + pub fn get_min_ver(&mut self) -> semver::Version { + let mut lowest = semver::Version::new(u64::MAX, u64::MAX, u64::MAX); + + self.0.iter().for_each(|x| { + if x.version.cmp_precedence(&lowest).is_lt() { + lowest = x.version.clone() + } + }); + + lowest + } +} + #[derive(Debug, Deserialize)] struct GameRecord { version: semver::Version, @@ -35,16 +52,16 @@ enum Quarter { #[derive(Debug, Deserialize)] enum TerrainState { - Distance(u8), + Yards(u8), GoalLine, - In, + Inches, } #[derive(Debug, Deserialize)] struct Play { action: Option, down: Down, - terrain: u8, + terrain: TerrainState, } enum DownError { diff --git a/src/main.rs b/src/main.rs index 4b980bb..6aeb6a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ mod calculator; mod gamelog; use clap::Parser; -use gamelog::LogFile; +use gamelog::{GAMELOG_MIN_VER, LogFile}; use std::path::PathBuf; #[derive(Debug, Parser)] @@ -12,9 +12,9 @@ struct Args { short, long, value_hint = clap::ValueHint::DirPath, - default_value = std::env::current_dir() + default_value = dbg!(format!("{}/templates/logfile.ron", std::env::current_dir() .expect("Failed to get current working dir.") - .into_os_string() + .into_os_string().to_str().unwrap())) )] logfile_path: PathBuf, } @@ -22,7 +22,7 @@ struct Args { fn main() { let config = Args::parse(); - let log: LogFile = LogFile::try_from( + let mut log: LogFile = LogFile::try_from( match std::fs::OpenOptions::new() // Defaults to setting all options false. .read(true) // Only need ensure that reading is possible. .open(&config.logfile_path.as_path()) @@ -32,4 +32,14 @@ fn main() { }, ) .expect("Failed to open game log file"); + + let log_ver = dbg!(log.get_min_ver()); + + if log_ver.cmp_precedence(&GAMELOG_MIN_VER).is_lt() { + panic!( + "Error: Log file GameRecord version deviates as low as {:?}, while minimum {:?} is required", + log_ver.to_string(), + GAMELOG_MIN_VER.to_string() + ) + } } diff --git a/templates/logfile.ron b/templates/logfile.ron index 9947a0a..2522f76 100644 --- a/templates/logfile.ron +++ b/templates/logfile.ron @@ -15,7 +15,7 @@ down: Kickoff( offence: Nebraska ), - terrain: Distance(10) + terrain: Yards(10) ), ] )