From 7a54625bb59504eb0037417ec431706959e2cca5 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Thu, 10 Dec 2020 15:21:10 +0100 Subject: [PATCH] Nullability, updated version --- .../Authentication/ApiCredentials.cs | 2 +- CryptoExchange.Net/BaseClient.cs | 7 ++++--- .../Converters/ArrayConverter.cs | 7 +++++-- CryptoExchange.Net/Converters/BaseConverter.cs | 6 +++--- .../Converters/TimestampConverter.cs | 9 ++++++--- .../TimestampNanoSecondsConverter.cs | 6 +++--- .../Converters/TimestampSecondsConverter.cs | 9 ++++++--- .../Converters/UTCDateTimeConverter.cs | 6 +++--- CryptoExchange.Net/CryptoExchange.Net.csproj | 8 ++++---- CryptoExchange.Net/CryptoExchange.Net.xml | 18 +++++++++++++++--- CryptoExchange.Net/Objects/CallResult.cs | 14 +++++++++++--- README.md | 5 +++++ 12 files changed, 66 insertions(+), 31 deletions(-) diff --git a/CryptoExchange.Net/Authentication/ApiCredentials.cs b/CryptoExchange.Net/Authentication/ApiCredentials.cs index 8900db9..e567e9f 100644 --- a/CryptoExchange.Net/Authentication/ApiCredentials.cs +++ b/CryptoExchange.Net/Authentication/ApiCredentials.cs @@ -109,7 +109,7 @@ namespace CryptoExchange.Net.Authentication { if (data[key] == null) return null; - return (string) data[key]; + return (string) data[key]!; } /// diff --git a/CryptoExchange.Net/BaseClient.cs b/CryptoExchange.Net/BaseClient.cs index a6749f1..60d6715 100644 --- a/CryptoExchange.Net/BaseClient.cs +++ b/CryptoExchange.Net/BaseClient.cs @@ -297,7 +297,8 @@ namespace CryptoExchange.Net if (ignore != null) continue; - properties.Add(attr == null ? prop.Name : ((JsonPropertyAttribute)attr).PropertyName); + var propertyName = ((JsonPropertyAttribute?) attr)?.PropertyName; + properties.Add(propertyName ?? prop.Name); } foreach (var token in obj) { @@ -319,12 +320,12 @@ namespace CryptoExchange.Net properties.Remove(d); var propType = GetProperty(d, props)?.PropertyType; - if (propType == null) + if (propType == null || token.Value == null) continue; if (!IsSimple(propType) && propType != typeof(DateTime)) { if (propType.IsArray && token.Value.HasValues && ((JArray)token.Value).Any() && ((JArray)token.Value)[0] is JObject) - CheckObject(propType.GetElementType(), (JObject)token.Value[0], requestId); + CheckObject(propType.GetElementType()!, (JObject)token.Value[0]!, requestId); else if (token.Value is JObject o) CheckObject(propType, o, requestId); } diff --git a/CryptoExchange.Net/Converters/ArrayConverter.cs b/CryptoExchange.Net/Converters/ArrayConverter.cs index 4d7b8bc..c06181c 100644 --- a/CryptoExchange.Net/Converters/ArrayConverter.cs +++ b/CryptoExchange.Net/Converters/ArrayConverter.cs @@ -21,7 +21,7 @@ namespace CryptoExchange.Net.Converters } /// - public override object? ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { if (objectType == typeof(JToken)) return JToken.Load(reader); @@ -115,8 +115,11 @@ namespace CryptoExchange.Net.Converters } /// - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { + if (value == null) + return; + writer.WriteStartArray(); var props = value.GetType().GetProperties(); var ordered = props.OrderBy(p => p.GetCustomAttribute()?.Index); diff --git a/CryptoExchange.Net/Converters/BaseConverter.cs b/CryptoExchange.Net/Converters/BaseConverter.cs index b21a521..14767b7 100644 --- a/CryptoExchange.Net/Converters/BaseConverter.cs +++ b/CryptoExchange.Net/Converters/BaseConverter.cs @@ -28,9 +28,9 @@ namespace CryptoExchange.Net.Converters } /// - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { - var stringValue = GetValue((T) value); + var stringValue = value == null? null: GetValue((T) value); if (quotes) writer.WriteValue(stringValue); else @@ -38,7 +38,7 @@ namespace CryptoExchange.Net.Converters } /// - public override object? ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { if (reader.Value == null) return null; diff --git a/CryptoExchange.Net/Converters/TimestampConverter.cs b/CryptoExchange.Net/Converters/TimestampConverter.cs index f1b9103..977b7c1 100644 --- a/CryptoExchange.Net/Converters/TimestampConverter.cs +++ b/CryptoExchange.Net/Converters/TimestampConverter.cs @@ -15,7 +15,7 @@ namespace CryptoExchange.Net.Converters } /// - public override object? ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { if (reader.Value == null) return null; @@ -25,9 +25,12 @@ namespace CryptoExchange.Net.Converters } /// - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { - writer.WriteValue((long)Math.Round(((DateTime)value - new DateTime(1970, 1, 1)).TotalMilliseconds)); + if(value == null) + writer.WriteValue((DateTime?)null); + else + writer.WriteValue((long)Math.Round(((DateTime)value - new DateTime(1970, 1, 1)).TotalMilliseconds)); } } } diff --git a/CryptoExchange.Net/Converters/TimestampNanoSecondsConverter.cs b/CryptoExchange.Net/Converters/TimestampNanoSecondsConverter.cs index 80727b6..90b023c 100644 --- a/CryptoExchange.Net/Converters/TimestampNanoSecondsConverter.cs +++ b/CryptoExchange.Net/Converters/TimestampNanoSecondsConverter.cs @@ -17,7 +17,7 @@ namespace CryptoExchange.Net.Converters } /// - public override object? ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { if (reader.Value == null) return null; @@ -27,9 +27,9 @@ namespace CryptoExchange.Net.Converters } /// - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { - writer.WriteValue((long)Math.Round(((DateTime)value - new DateTime(1970, 1, 1)).Ticks / ticksPerNanosecond)); + writer.WriteValue((long)Math.Round(((DateTime)value! - new DateTime(1970, 1, 1)).Ticks / ticksPerNanosecond)); } } } diff --git a/CryptoExchange.Net/Converters/TimestampSecondsConverter.cs b/CryptoExchange.Net/Converters/TimestampSecondsConverter.cs index 1b2264a..63a83eb 100644 --- a/CryptoExchange.Net/Converters/TimestampSecondsConverter.cs +++ b/CryptoExchange.Net/Converters/TimestampSecondsConverter.cs @@ -16,7 +16,7 @@ namespace CryptoExchange.Net.Converters } /// - public override object? ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { if (reader.Value == null) return null; @@ -29,9 +29,12 @@ namespace CryptoExchange.Net.Converters } /// - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { - writer.WriteValue((long)Math.Round(((DateTime)value - new DateTime(1970, 1, 1)).TotalSeconds)); + if (value == null) + writer.WriteValue((DateTime?)null); + else + writer.WriteValue((long)Math.Round(((DateTime)value! - new DateTime(1970, 1, 1)).TotalSeconds)); } } } diff --git a/CryptoExchange.Net/Converters/UTCDateTimeConverter.cs b/CryptoExchange.Net/Converters/UTCDateTimeConverter.cs index 9690f7f..efd84f8 100644 --- a/CryptoExchange.Net/Converters/UTCDateTimeConverter.cs +++ b/CryptoExchange.Net/Converters/UTCDateTimeConverter.cs @@ -9,20 +9,20 @@ namespace CryptoExchange.Net.Converters public class UTCDateTimeConverter: JsonConverter { /// - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { writer.WriteValue(JsonConvert.SerializeObject(value)); } /// - public override object? ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { if (reader.Value == null) return null; DateTime value; if (reader.Value is string s) - value = (DateTime)JsonConvert.DeserializeObject(s); + value = (DateTime)JsonConvert.DeserializeObject(s)!; else value = (DateTime) reader.Value; diff --git a/CryptoExchange.Net/CryptoExchange.Net.csproj b/CryptoExchange.Net/CryptoExchange.Net.csproj index ecfb92c..b006a20 100644 --- a/CryptoExchange.Net/CryptoExchange.Net.csproj +++ b/CryptoExchange.Net/CryptoExchange.Net.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1 @@ -6,13 +6,13 @@ CryptoExchange.Net JKorf A base package for implementing cryptocurrency exchange API's - 3.2.1 - 3.2.0 + 3.3.0 + 3.3.0 false https://github.com/JKorf/CryptoExchange.Net en true - 3.2.1 - Fixed error code parsing + 3.3.0 - Added client name, Added common interfaces, Fixed api key plain text storing in RateLimitterApiKey enable 8.0 MIT diff --git a/CryptoExchange.Net/CryptoExchange.Net.xml b/CryptoExchange.Net/CryptoExchange.Net.xml index 148cefe..4e8ba34 100644 --- a/CryptoExchange.Net/CryptoExchange.Net.xml +++ b/CryptoExchange.Net/CryptoExchange.Net.xml @@ -1636,9 +1636,7 @@ Create an error result - - - + @@ -1666,6 +1664,20 @@ + + + Create new based on existing + + + + + + Create from a call result + + + + + Create an error result diff --git a/CryptoExchange.Net/Objects/CallResult.cs b/CryptoExchange.Net/Objects/CallResult.cs index 23409e5..d19e8f9 100644 --- a/CryptoExchange.Net/Objects/CallResult.cs +++ b/CryptoExchange.Net/Objects/CallResult.cs @@ -158,9 +158,7 @@ namespace CryptoExchange.Net.Objects /// /// Create an error result /// - /// - /// - /// + /// /// public static WebCallResult CreateErrorResult(WebCallResult result) { @@ -199,12 +197,22 @@ namespace CryptoExchange.Net.Objects ResponseHeaders = responseHeaders; } + /// + /// Create new based on existing + /// + /// public WebCallResult(WebCallResult callResult): base(callResult.Data, callResult.Error) { ResponseHeaders = callResult.ResponseHeaders; ResponseStatusCode = callResult.ResponseStatusCode; } + /// + /// Create from a call result + /// + /// + /// + /// public static WebCallResult CreateFrom(WebCallResult source) where Y : T { return new WebCallResult(source.ResponseStatusCode, source.ResponseHeaders, (T)source.Data, source.Error); diff --git a/README.md b/README.md index 30d957b..fecb8fe 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,11 @@ The order book will automatically reconnect when the connection is lost and resy To stop synchronizing an order book use the `Stop` method. ## Release notes +* Version 3.3.0 - 10 dec 2020 + * Added client name + * Added common interfaces + * Fixed api key plain text storing in RateLimitterApiKey + * Version 3.2.1 - 19 nov 2020 * Fixed error code parsing