1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-12 02:16:23 +00:00

Nullability, updated version

This commit is contained in:
Jkorf 2020-12-10 15:21:10 +01:00
parent dd06f48fc1
commit 7a54625bb5
12 changed files with 66 additions and 31 deletions

View File

@ -109,7 +109,7 @@ namespace CryptoExchange.Net.Authentication
{ {
if (data[key] == null) if (data[key] == null)
return null; return null;
return (string) data[key]; return (string) data[key]!;
} }
/// <summary> /// <summary>

View File

@ -297,7 +297,8 @@ namespace CryptoExchange.Net
if (ignore != null) if (ignore != null)
continue; 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) foreach (var token in obj)
{ {
@ -319,12 +320,12 @@ namespace CryptoExchange.Net
properties.Remove(d); properties.Remove(d);
var propType = GetProperty(d, props)?.PropertyType; var propType = GetProperty(d, props)?.PropertyType;
if (propType == null) if (propType == null || token.Value == null)
continue; continue;
if (!IsSimple(propType) && propType != typeof(DateTime)) if (!IsSimple(propType) && propType != typeof(DateTime))
{ {
if (propType.IsArray && token.Value.HasValues && ((JArray)token.Value).Any() && ((JArray)token.Value)[0] is JObject) 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) else if (token.Value is JObject o)
CheckObject(propType, o, requestId); CheckObject(propType, o, requestId);
} }

View File

@ -21,7 +21,7 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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)) if (objectType == typeof(JToken))
return JToken.Load(reader); return JToken.Load(reader);
@ -115,8 +115,11 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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(); writer.WriteStartArray();
var props = value.GetType().GetProperties(); var props = value.GetType().GetProperties();
var ordered = props.OrderBy(p => p.GetCustomAttribute<ArrayPropertyAttribute>()?.Index); var ordered = props.OrderBy(p => p.GetCustomAttribute<ArrayPropertyAttribute>()?.Index);

View File

@ -28,9 +28,9 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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) if (quotes)
writer.WriteValue(stringValue); writer.WriteValue(stringValue);
else else
@ -38,7 +38,7 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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) if (reader.Value == null)
return null; return null;

View File

@ -15,7 +15,7 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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) if (reader.Value == null)
return null; return null;
@ -25,9 +25,12 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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));
} }
} }
} }

View File

@ -17,7 +17,7 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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) if (reader.Value == null)
return null; return null;
@ -27,9 +27,9 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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));
} }
} }
} }

View File

@ -16,7 +16,7 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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) if (reader.Value == null)
return null; return null;
@ -29,9 +29,12 @@ namespace CryptoExchange.Net.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
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));
} }
} }
} }

View File

@ -9,20 +9,20 @@ namespace CryptoExchange.Net.Converters
public class UTCDateTimeConverter: JsonConverter public class UTCDateTimeConverter: JsonConverter
{ {
/// <inheritdoc /> /// <inheritdoc />
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)); writer.WriteValue(JsonConvert.SerializeObject(value));
} }
/// <inheritdoc /> /// <inheritdoc />
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) if (reader.Value == null)
return null; return null;
DateTime value; DateTime value;
if (reader.Value is string s) if (reader.Value is string s)
value = (DateTime)JsonConvert.DeserializeObject(s); value = (DateTime)JsonConvert.DeserializeObject(s)!;
else else
value = (DateTime) reader.Value; value = (DateTime) reader.Value;

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks> <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
@ -6,13 +6,13 @@
<PackageId>CryptoExchange.Net</PackageId> <PackageId>CryptoExchange.Net</PackageId>
<Authors>JKorf</Authors> <Authors>JKorf</Authors>
<Description>A base package for implementing cryptocurrency exchange API's</Description> <Description>A base package for implementing cryptocurrency exchange API's</Description>
<PackageVersion>3.2.1</PackageVersion> <PackageVersion>3.3.0</PackageVersion>
<AssemblyVersion>3.2.0</AssemblyVersion> <AssemblyVersion>3.3.0</AssemblyVersion>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl> <PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl>
<NeutralLanguage>en</NeutralLanguage> <NeutralLanguage>en</NeutralLanguage>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageReleaseNotes>3.2.1 - Fixed error code parsing</PackageReleaseNotes> <PackageReleaseNotes>3.3.0 - Added client name, Added common interfaces, Fixed api key plain text storing in RateLimitterApiKey</PackageReleaseNotes>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<LangVersion>8.0</LangVersion> <LangVersion>8.0</LangVersion>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>

View File

@ -1636,9 +1636,7 @@
<summary> <summary>
Create an error result Create an error result
</summary> </summary>
<param name="code"></param> <param name="result"></param>
<param name="responseHeaders"></param>
<param name="error"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:CryptoExchange.Net.Objects.WebCallResult`1"> <member name="T:CryptoExchange.Net.Objects.WebCallResult`1">
@ -1666,6 +1664,20 @@
<param name="data"></param> <param name="data"></param>
<param name="error"></param> <param name="error"></param>
</member> </member>
<member name="M:CryptoExchange.Net.Objects.WebCallResult`1.#ctor(CryptoExchange.Net.Objects.WebCallResult{`0})">
<summary>
Create new based on existing
</summary>
<param name="callResult"></param>
</member>
<member name="M:CryptoExchange.Net.Objects.WebCallResult`1.CreateFrom``1(CryptoExchange.Net.Objects.WebCallResult{``0})">
<summary>
Create from a call result
</summary>
<typeparam name="Y"></typeparam>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:CryptoExchange.Net.Objects.WebCallResult`1.CreateErrorResult(System.Nullable{System.Net.HttpStatusCode},System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.String,System.Collections.Generic.IEnumerable{System.String}}},CryptoExchange.Net.Objects.Error)"> <member name="M:CryptoExchange.Net.Objects.WebCallResult`1.CreateErrorResult(System.Nullable{System.Net.HttpStatusCode},System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.String,System.Collections.Generic.IEnumerable{System.String}}},CryptoExchange.Net.Objects.Error)">
<summary> <summary>
Create an error result Create an error result

View File

@ -158,9 +158,7 @@ namespace CryptoExchange.Net.Objects
/// <summary> /// <summary>
/// Create an error result /// Create an error result
/// </summary> /// </summary>
/// <param name="code"></param> /// <param name="result"></param>
/// <param name="responseHeaders"></param>
/// <param name="error"></param>
/// <returns></returns> /// <returns></returns>
public static WebCallResult CreateErrorResult(WebCallResult result) public static WebCallResult CreateErrorResult(WebCallResult result)
{ {
@ -199,12 +197,22 @@ namespace CryptoExchange.Net.Objects
ResponseHeaders = responseHeaders; ResponseHeaders = responseHeaders;
} }
/// <summary>
/// Create new based on existing
/// </summary>
/// <param name="callResult"></param>
public WebCallResult(WebCallResult<T> callResult): base(callResult.Data, callResult.Error) public WebCallResult(WebCallResult<T> callResult): base(callResult.Data, callResult.Error)
{ {
ResponseHeaders = callResult.ResponseHeaders; ResponseHeaders = callResult.ResponseHeaders;
ResponseStatusCode = callResult.ResponseStatusCode; ResponseStatusCode = callResult.ResponseStatusCode;
} }
/// <summary>
/// Create from a call result
/// </summary>
/// <typeparam name="Y"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static WebCallResult<T> CreateFrom<Y>(WebCallResult<Y> source) where Y : T public static WebCallResult<T> CreateFrom<Y>(WebCallResult<Y> source) where Y : T
{ {
return new WebCallResult<T>(source.ResponseStatusCode, source.ResponseHeaders, (T)source.Data, source.Error); return new WebCallResult<T>(source.ResponseStatusCode, source.ResponseHeaders, (T)source.Data, source.Error);

View File

@ -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. To stop synchronizing an order book use the `Stop` method.
## Release notes ## 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 * Version 3.2.1 - 19 nov 2020
* Fixed error code parsing * Fixed error code parsing