use std::convert::TryFrom; use std::env::args; use std::fs::File; use std::io::BufRead; use std::io::BufReader; mod package; use package::Package; use package::PackageReader; impl std::fmt::Display for Package { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{{")?; write!(f, "\"version\": {},", self.version)?; write!(f, "\"type\": {},", self._type)?; write!(f, "\"value\": {},", self.value)?; write!(f, "\"children\": [")?; let mut first = true; for child in self.children.iter() { if first { first = false; } else { write!(f, ", ")?; } write!(f, "{}", child)?; } write!(f, "]}}")?; return Ok(()); } } fn sum_version(package: &Package) -> u64 { return u64::from(package.version) + package.children .iter() .map(|p| sum_version(p)) .sum::(); } fn main() { let path = args().nth(1).unwrap(); let file = File::open(path).unwrap(); for line in BufReader::new(file).lines() { let buffer: Vec = line .unwrap() .chars() .map(|c| u8::try_from(c.to_digit(16).unwrap()).unwrap()) .collect(); let package = PackageReader::read(buffer).unwrap(); // println!("{}", package); println!("{}", sum_version(&package)); } }