#[derive(Debug, PartialEq)] pub enum Error { NotEnoughPinsLeft, GameComplete, } #[derive(Debug, Default)] pub struct BowlingGame { throws: Vec, prev: u16 } impl BowlingGame { pub fn new() -> Self { Default::default() } pub fn roll(&mut self, pins: u16) -> Result<(), Error> { if pins + self.prev > 10 { Err(Error::NotEnoughPinsLeft) } else if self.score().is_some() { Err(Error::GameComplete) } else { self.throws.push(pins); self.prev = if self.prev + pins == 10 { 0 } else { pins }; Ok(()) } } pub fn score(&self) -> Option { let mut score = 0; let mut stage = 0; for _ in 1..=10 { let first = self.throws.get(stage)?; let second = self.throws.get(stage+1)?; score += first + second; if first + second >= 10 { let third = self.throws.get(stage+2)?; score += third; } stage += if *first == 10 { 1 } else { 2 }; } Some(score) } }