1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2026-02-16 14:13:46 +00:00

181 lines
6.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
namespace CryptoExchange.Net.SharedApis
{
/// <summary>
/// Exchange parameters
/// </summary>
public class ExchangeParameters
{
private readonly List<ExchangeParameter> _parameters;
private readonly static List<ExchangeParameter> _staticParameters = new List<ExchangeParameter>();
/// <summary>
/// ctor
/// </summary>
/// <param name="parameters">The parameters to add</param>
public ExchangeParameters(params ExchangeParameter[] parameters)
{
_parameters = parameters.ToList();
}
/// <summary>
/// Add a new parameter value
/// </summary>
/// <param name="exchangeParameter"></param>
public void AddValue(ExchangeParameter exchangeParameter)
{
_parameters.Add(exchangeParameter);
}
/// <summary>
/// Check whether a specific parameter is provided in this specific instance
/// </summary>
/// <param name="exchange">The exchange name</param>
/// <param name="name">Parameter name</param>
/// <param name="type">Type of the parameter value</param>
/// <returns></returns>
public bool HasValue(string exchange, string name, Type type)
{
var val = _parameters.SingleOrDefault(x => x.Exchange.Equals(exchange, StringComparison.InvariantCulture) && x.Name.Equals(name, StringComparison.InvariantCulture));
val ??= _staticParameters.SingleOrDefault(x => x.Exchange.Equals(exchange, StringComparison.InvariantCulture) && x.Name.Equals(name, StringComparison.InvariantCulture));
if (val == null)
return false;
try
{
Type t = Nullable.GetUnderlyingType(type) ?? type;
Convert.ChangeType(val.Value, t);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// Check whether a specific parameter is provided in the default parameters or the provided instance
/// </summary>
/// <param name="exchangeParameters">The provided exchange parameter in the request</param>
/// <param name="exchange">The exchange name</param>
/// <param name="name">Parameter name</param>
/// <param name="type">Type of the parameter value</param>
/// <returns></returns>
public static bool HasValue(ExchangeParameters? exchangeParameters, string exchange, string name, Type type)
{
var provided = exchangeParameters?.HasValue(exchange, name, type);
if (provided == true)
return true;
var val = _staticParameters.SingleOrDefault(x => x.Exchange.Equals(exchange, StringComparison.InvariantCulture) && x.Name.Equals(name, StringComparison.InvariantCulture));
if (val == null)
return false;
try
{
Type t = Nullable.GetUnderlyingType(type) ?? type;
Convert.ChangeType(val.Value, t);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// Get the value of a parameter from this instance
/// </summary>
/// <typeparam name="T">Type of the parameter value</typeparam>
/// <param name="exchange">Exchange name</param>
/// <param name="name">Parameter name</param>
public T? GetValue<T>(string exchange, string name)
{
var val = _parameters.SingleOrDefault(x => x.Exchange.Equals(exchange, StringComparison.InvariantCulture) && x.Name.Equals(name, StringComparison.InvariantCulture));
if (val == null)
return default;
if (val.Value is T typeVal)
return typeVal;
try
{
Type t = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
return (T)Convert.ChangeType(val.Value, t);
}
catch
{
throw new ArgumentException("Incorrect type for parameter, expected " + typeof(T).Name, name);
}
}
/// <summary>
/// Get the value of a parameter from this instance or the default values
/// </summary>
/// <typeparam name="T">Type of the parameter value</typeparam>
/// <param name="exchangeParameters">The request parameters</param>
/// <param name="exchange">Exchange name</param>
/// <param name="name">Parameter name</param>
public static T? GetValue<T>(ExchangeParameters? exchangeParameters, string exchange, string name)
{
T? value;
if (exchangeParameters == null)
{
var parameter = _staticParameters.SingleOrDefault(x => x.Exchange.Equals(exchange, StringComparison.InvariantCulture) && x.Name.Equals(name, StringComparison.InvariantCulture));
if (parameter == null)
return default;
if (parameter.Value is T val)
return val;
try
{
Type t = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
return (T)Convert.ChangeType(parameter.Value, t);
}
catch
{
throw new ArgumentException("Incorrect type for parameter, expected " + typeof(T).Name, name);
}
}
else
{
value = exchangeParameters.GetValue<T>(exchange, name);
}
return value;
}
/// <summary>
/// Set static parameters
/// </summary>
/// <param name="exchange">Exchange name</param>
/// <param name="key">Parameter name</param>
/// <param name="value">Parameter value</param>
public static void SetStaticParameter(string exchange, string key, object value)
{
var existing = _staticParameters.SingleOrDefault(x => x.Exchange.Equals(exchange, StringComparison.InvariantCulture) && x.Name.Equals(key, StringComparison.InvariantCulture));
if (existing != null)
{
existing.Value = value;
return;
}
_staticParameters.Add(new ExchangeParameter(exchange, key, value));
}
/// <summary>
/// Reset the static parameters, clears all parameters for all exchanges
/// </summary>
public static void ResetStaticParameters()
{
_staticParameters.Clear();
}
}
}