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 { /// public new void Add(string key, object value) { if (value == null) throw new ArgumentNullException(key); base.Add(key, value); } /// /// Add an optional parameter. Not added if value is null /// /// /// public void AddOptional(string key, object? value) { if (value != null) base.Add(key, value); } /// /// Add a decimal value as string /// /// /// public void AddString(string key, decimal value) { base.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) base.Add(key, value.Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a int value as string /// /// /// public void AddString(string key, int value) { base.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) base.Add(key, value.Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a long value as string /// /// /// public void AddString(string key, long value) { base.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) base.Add(key, value.Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a DateTime value as string /// public void AddString(string key, DateTime value) { base.Add(key, value.ToString("yyyy-MM-ddTHH:mm:ssZ")); } /// /// Add a DateTime value as string. Not added if value is null /// public void AddOptionalString(string key, DateTime? value) { if (value != null) base.Add(key, value.Value.ToString("yyyy-MM-ddTHH:mm:ssZ")); } /// /// Add a datetime value as milliseconds timestamp /// /// /// public void AddMilliseconds(string key, DateTime value) { base.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) base.Add(key, DateTimeConverter.ConvertToMilliseconds(value)); } /// /// Add a datetime value as milliseconds timestamp /// /// /// public void AddMillisecondsString(string key, DateTime value) { base.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) base.Add(key, DateTimeConverter.ConvertToMilliseconds(value).Value.ToString(CultureInfo.InvariantCulture)); } /// /// Add a datetime value as seconds timestamp /// /// /// public void AddSeconds(string key, DateTime value) { base.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) base.Add(key, DateTimeConverter.ConvertToSeconds(value)); } /// /// Add a datetime value as string seconds timestamp /// /// /// public void AddSecondsString(string key, DateTime value) { base.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) base.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 { base.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)!; base.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) base.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); base.Add(key, int.Parse(stringVal)); } } /// /// Add key as comma separated values /// public void AddCommaSeparated(string key, IEnumerable values) { base.Add(key, string.Join(",", values)); } /// /// Add key as comma separated values if there are values provided /// public void AddOptionalCommaSeparated(string key, IEnumerable? values) { if (values == null || !values.Any()) return; base.Add(key, string.Join(",", values)); } /// /// Add key as comma separated values /// #if NET5_0_OR_GREATER public void AddCommaSeparated<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T>(string key, IEnumerable values) #else public void AddCommaSeparated(string key, IEnumerable values) #endif where T : struct, Enum { base.Add(key, string.Join(",", values.Select(x => EnumConverter.GetString(x)))); } /// /// Add key as comma separated values if there are values provided /// #if NET5_0_OR_GREATER public void AddOptionalCommaSeparated<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T>(string key, IEnumerable? values) #else public void AddOptionalCommaSeparated(string key, IEnumerable? values) #endif where T : struct, Enum { if (values == null || !values.Any()) return; base.Add(key, string.Join(",", values.Select(x => EnumConverter.GetString(x)))); } /// /// Add key as boolean lower case value /// public void AddBoolString(string key, bool value) { base.Add(key, value.ToString().ToLower()); } /// /// Add key as boolean lower case value if it's not null /// public void AddOptionalBoolString(string key, bool? value) { if (value == null) return; base.Add(key, value.ToString()!.ToLower()); } /// /// 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"); base.Add(Constants.BodyPlaceHolderKey, body); } } }