using CryptoExchange.Net.Attributes; using CryptoExchange.Net.Converters.SystemTextJson; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; namespace CryptoExchange.Net.Objects { /// /// Parameters collection /// public class ParameterCollection : Dictionary { /// /// Add an optional parameter. Not added if value is null /// /// /// public void AddOptional(string key, object? value) { if (value != null) Add(key, value); } /// /// Add a decimal value as string /// /// /// public void AddString(string key, decimal value) { Add(key, value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a decimal value as string. Not added if value is null /// /// /// public void AddOptionalString(string key, decimal? value) { if (value != null) Add(key, value.Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a int value as string /// /// /// public void AddString(string key, int value) { Add(key, value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a int value as string. Not added if value is null /// /// /// public void AddOptionalString(string key, int? value) { if (value != null) Add(key, value.Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a long value as string /// /// /// public void AddString(string key, long value) { Add(key, value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a long value as string. Not added if value is null /// /// /// public void AddOptionalString(string key, long? value) { if (value != null) Add(key, value.Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a datetime value as milliseconds timestamp /// /// /// public void AddMilliseconds(string key, DateTime value) { Add(key, DateTimeConverter.ConvertToMilliseconds(value)); } /// /// Add a datetime value as milliseconds timestamp. Not added if value is null /// /// /// public void AddOptionalMilliseconds(string key, DateTime? value) { if (value != null) Add(key, DateTimeConverter.ConvertToMilliseconds(value)); } /// /// Add a datetime value as milliseconds timestamp /// /// /// public void AddMillisecondsString(string key, DateTime value) { Add(key, DateTimeConverter.ConvertToMilliseconds(value).Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a datetime value as milliseconds timestamp. Not added if value is null /// /// /// public void AddOptionalMillisecondsString(string key, DateTime? value) { if (value != null) Add(key, DateTimeConverter.ConvertToMilliseconds(value).Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a datetime value as seconds timestamp /// /// /// public void AddSeconds(string key, DateTime value) { Add(key, DateTimeConverter.ConvertToSeconds(value)); } /// /// Add a datetime value as seconds timestamp. Not added if value is null /// /// /// public void AddOptionalSeconds(string key, DateTime? value) { if (value != null) Add(key, DateTimeConverter.ConvertToSeconds(value)); } /// /// Add a datetime value as string seconds timestamp /// /// /// public void AddSecondsString(string key, DateTime value) { Add(key, DateTimeConverter.ConvertToSeconds(value).ToString()!); } /// /// Add a datetime value as string seconds timestamp. Not added if value is null /// /// /// public void AddOptionalSecondsString(string key, DateTime? value) { if (value != null) Add(key, DateTimeConverter.ConvertToSeconds(value).ToString()!); } /// /// Add an enum value as the string value as mapped using the /// #if NET5_0_OR_GREATER public void AddEnum<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T>(string key, T value) #else public void AddEnum(string key, T value) #endif where T : struct, Enum { Add(key, EnumConverter.GetString(value)!); } /// /// Add an enum value as the string value as mapped using the /// /// /// #if NET5_0_OR_GREATER public void AddEnumAsInt<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T>(string key, T value) #else public void AddEnumAsInt(string key, T value) #endif where T : struct, Enum { var stringVal = EnumConverter.GetString(value)!; Add(key, int.Parse(stringVal)!); } /// /// Add an enum value as the string value as mapped using the . Not added if value is null /// /// /// #if NET5_0_OR_GREATER public void AddOptionalEnum<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T>(string key, T? value) #else public void AddOptionalEnum(string key, T? value) #endif where T : struct, Enum { if (value != null) Add(key, EnumConverter.GetString(value)); } /// /// Add an enum value as the string value as mapped using the . Not added if value is null /// #if NET5_0_OR_GREATER public void AddOptionalEnumAsInt<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T>(string key, T? value) #else public void AddOptionalEnumAsInt(string key, T? value) #endif where T : struct, Enum { if (value != null) { var stringVal = EnumConverter.GetString(value); Add(key, int.Parse(stringVal)); } } /// /// Set the request body. Can be used to specify a simple value or array as the body instead of an object /// /// Body to set /// public void SetBody(object body) { if (this.Any()) throw new InvalidOperationException("Can't set body when other parameters already specified"); Add(Constants.BodyPlaceHolderKey, body); } } }