using CShocker.Ranges; using CShocker.Shockers.Abstract; using CShocker.Shockers.APIS; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace CShocker.Shockers; public class ShockerJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(Shocker)); } public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); ShockerApi? apiType = (ShockerApi?)jo.SelectToken("ApiType")?.Value(); switch (apiType) { case ShockerApi.OpenShockHttp: return new OpenShockHttp( jo.SelectToken("ShockerIds")!.ToObject>()!, jo.SelectToken("IntensityRange")!.ToObject()!, jo.SelectToken("DurationRange")!.ToObject()!, jo.SelectToken("ApiKey")!.Value()!, jo.SelectToken("Endpoint")!.Value()! ); case ShockerApi.OpenShockSerial: return new OpenShockSerial( jo.SelectToken("Model")!.ToObject>()!, jo.SelectToken("IntensityRange")!.ToObject()!, jo.SelectToken("DurationRange")!.ToObject()!, jo.SelectToken("SerialPortI")!.ToObject()! ); case ShockerApi.PiShockHttp: return new PiShockHttp( jo.SelectToken("ShockerIds")!.ToObject>()!, jo.SelectToken("IntensityRange")!.ToObject()!, jo.SelectToken("DurationRange")!.ToObject()!, jo.SelectToken("ApiKey")!.Value()!, jo.SelectToken("Username")!.Value()!, jo.SelectToken("ShareCode")!.Value()!, jo.SelectToken("Endpoint")!.Value()! ); case ShockerApi.PiShockSerial: throw new NotImplementedException(); default: 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"); } }