using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Tranga.MangaConnectors; namespace Tranga.Jobs; public class JobJsonConverter : JsonConverter { private GlobalBase _clone; private MangaConnectorJsonConverter _mangaConnectorJsonConverter; internal JobJsonConverter(GlobalBase clone, MangaConnectorJsonConverter mangaConnectorJsonConverter) { this._clone = clone; this._mangaConnectorJsonConverter = mangaConnectorJsonConverter; } public override bool CanConvert(Type objectType) { return (objectType == typeof(Job)); } public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); if(!jo.ContainsKey("jobType")) throw new Exception(); return Enum.Parse(jo["jobType"]!.Value().ToString()) switch { Job.JobType.UpdateMetaDataJob => new UpdateMetadata(_clone, jo.GetValue("mangaInternalId")!.Value()!, jo.GetValue("parentJobId")!.Value()), Job.JobType.DownloadChapterJob => new DownloadChapter(this._clone, jo.GetValue("chapter")!.ToObject(JsonSerializer.Create(new JsonSerializerSettings() { Converters = { this._mangaConnectorJsonConverter } })), DateTime.UnixEpoch, jo.GetValue("parentJobId")!.Value()), Job.JobType.DownloadNewChaptersJob => new DownloadNewChapters(this._clone, jo.GetValue("mangaInternalId")!.Value()!, jo.GetValue("lastExecution") is {} le ? le.ToObject() : DateTime.UnixEpoch, jo.GetValue("recurring")!.Value(), jo.GetValue("recurrenceTime")!.ToObject(), jo.GetValue("parentJobId")!.Value()), _ => throw new Exception() }; } public override bool CanWrite => false; /// /// Don't call this /// public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { throw new Exception("Dont call this"); } }