public void Start() { try { isStarted = true; while (isStarted) { int userInput; switch (currentState) { case MenuStates.Initialized: gui.ClearScreen(); menuPrinter.FirstScreen(); userInput = gui.ReadInputInteger(); currentState = menuValidator.ValidateStateTransition(userInput, currentState, myLogger); break; case MenuStates.OrderingDrink: gui.ClearScreen(); menuPrinter.SecondScreen(); userInput = gui.ReadInputInteger(); drink = coffeeRobot.MakeDrink(userInput); currentState = menuValidator.ValidateStateTransition(userInput, currentState, myLogger, drink); break; case MenuStates.SelectDrinkSize: gui.ClearScreen(); menuPrinter.ThirdScreen(); userInput = gui.ReadInputInteger(); currentState = menuValidator.ValidateStateTransition(userInput, currentState, myLogger, drink); drink.SetDrinkSize(userInput.ToDrinkSize()); break; case MenuStates.SelectCoffeeType: gui.ClearScreen(); menuPrinter.FourthScreen(); userInput = gui.ReadInputInteger(); currentState = menuValidator.ValidateStateTransition(userInput, currentState, myLogger, drink); (drink as ICoffeineDrink).SetCoffeeType(userInput.ToCoffeeType()); break; case MenuStates.Finished: gui.ClearScreen(); menuPrinter.FifthScreen(); gui.PrintMessageOnLine($"You ordered : {drink.GetDetails()}"); myLogger.Info("User ordered: " + drink.GetDetails()); userInput = gui.ReadInputInteger(); currentState = menuValidator.ValidateStateTransition(userInput, currentState, myLogger); break; case MenuStates.Exit: isStarted = false; break; } } } catch (MyCustomException e) { myLogger.Fatal("Could not resolve menu!"); } }