using System.Collections.ObjectModel; using System.Text.Json; using Snake.Model; namespace Snake.Persistance; public class SnakeLevelLoader{ #region Fields private readonly string SaveFileName; private List? _stored_levels; #endregion #region Properties public ReadOnlyCollection StoredLevels => _stored_levels?.AsReadOnly() ?? throw new InvalidOperationException("Can not query stored levels before loading the data"); #endregion #region Constructors public SnakeLevelLoader(string saveFileName){ SaveFileName = saveFileName; if(!File.Exists(SaveFileName)){ throw new FileNotFoundException("Save file not found", SaveFileName); } } #endregion #region Methods public async Task ReadAllDataAsync() { string file_content = await File.ReadAllTextAsync(SaveFileName); _stored_levels = JsonSerializer.Deserialize>(file_content, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower }) ?? throw new JsonException("Failed to deserialize stored levels"); } public SnakeLevel LoadLevel(StoredSnakeLevel level){ return new SnakeLevel(level.Size, level.Obstacles.Select(a => new Point(a[0], a[1])), level.SnakeStartLength, level.NewEggRound, level.EggLimit); } #endregion }