using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Threading.Tasks; using Avalonia.Controls; using Newtonsoft.Json; namespace CrossLangDevStudio.Models; public class ProjectPackageManager : IPackageManager { public ProjectPackageManager(string path) { Path = path; } public string Path { get; init; } public string Filter => "lib,compile_tool"; public IEnumerable GetInstalledPackages() { var cfg = JsonConvert.DeserializeObject(File.ReadAllText(Path)); if (cfg is not null) { foreach (var item in cfg.Dependencies) { yield return item; } } } public async Task InstallPackageAsync(string name, CrossLangVersion version) { var cfg = JsonConvert.DeserializeObject(await File.ReadAllTextAsync(Path)) ?? new CrossLangConfig(); cfg.Dependencies ??= new List(); bool has = false; foreach (var item in cfg.Dependencies) { if (item.Name == name) { has = true; if(version.CompareTo(item.Version) > 0) item.Version = version; break; } } if (!has) cfg.Dependencies.Add(new CrossLangDependency { Name = name, Version = version }); await File.WriteAllTextAsync(Path, JsonConvert.SerializeObject(cfg, Formatting.Indented, new JsonSerializerSettings(){NullValueHandling= NullValueHandling.Ignore})); } public void UninstallPackage(string name) { var cfg = JsonConvert.DeserializeObject(File.ReadAllText(Path)) ?? new CrossLangConfig(); cfg.Dependencies ??= new List(); foreach (var item in cfg.Dependencies) { if (item.Name == name) { cfg.Dependencies.Remove(item); break; } } File.WriteAllText(Path, JsonConvert.SerializeObject(cfg, Formatting.Indented,new JsonSerializerSettings(){NullValueHandling= NullValueHandling.Ignore})); } }