//thats the main configuration function
        private XchangeDescriptor[] ReadExchangeDescriptorConfiguration(IConfiguration section)
        {
            var descriptors     = section.GetChildren();
            int exchangeConfigs = descriptors.Count();

            XchangeDescriptor[] exchanges = new XchangeDescriptor[exchangeConfigs + 1];
            if (exchangeConfigs == 0)
            {
                return(exchanges);
            }

            foreach (var exchange in descriptors)
            {
                var exchangeDescriptor = new XchangeDescriptor();
                exchangeDescriptor.Name            = exchange.GetValue <string>("Name");
                exchangeDescriptor.BaseUrl         = exchange.GetValue <string>("BaseUrl");
                exchangeDescriptor.ApiKeyString    = exchange.GetValue <string>("ApiKeyString");
                exchangeDescriptor.SignString      = exchange.GetValue <string>("SignString");
                exchangeDescriptor.TimeStampString = exchange.GetValue <string>("TimeStampString");
                var exchangeEnum = Enum.Parse <Xchange>(exchangeDescriptor.Name);
                exchangeDescriptor.Id          = (int)exchangeEnum;
                exchangeDescriptor.DomainTypes = XchangeConfigToolkit.GenerateTypesDictionary(_dataTypes, exchange.GetSection("DomainTypes"));
                exchangeDescriptor.EndPoints   = GeneratingEndPoints(exchange, exchangeDescriptor.BaseUrl);
                exchangeDescriptor.SetEndPointReturnTypes();
                exchangeDescriptor.SocketDescriptor = ReadSocketConfig(exchange);
                //not tested and not needed yet! exchangeDescriptor.SocketDescriptor.TypeDescriptors = XchangeConfigToolkit.GenerateTypesDictionary(_dataTypes, exchange.GetSection("Socket:Types"));
                exchangeDescriptor.SocketDescriptor.Xchange = exchangeEnum;
                exchangeDescriptor.SocketDescriptor.SubscriptionArgs.Each(s => s.Value.ReturnType = exchangeDescriptor.DomainTypes.GetValueOrDefault(s.Key));
                if (VerifyExchangeDescriptor(exchangeDescriptor))
                {
                    exchanges[exchangeDescriptor.Id] = exchangeDescriptor;
                }
            }
            return(exchanges);
        }
        /// <summary>
        /// returns array of valid endpoints
        /// </summary>
        /// <param name="endPoints"></param>
        /// <returns></returns>
        private static EndPoint[] GeneratingEndPoints(IConfigurationSection exchange, string baseUrl)
        {
            var endPoints     = XchangeConfigToolkit.ReadExchangeEndPoints(null, exchange.GetSection("Routes"));
            var endPointArray = new EndPoint[typeof(XchangeHttpOperation).GetTypeInfo().Fields().Length + 1];

            foreach (var eP in endPoints)
            {
                eP.Value.Url = $"{baseUrl}{eP.Value.Url}";
                var operation = XchangeHttpOperation.Unknown;
                if (Enum.TryParse <XchangeHttpOperation>(eP.Key, out operation))
                {
                    endPointArray[(int)operation] = eP.Value;
                    continue;
                }
                endPointArray[(int)operation] = eP.Value;
            }
            return(endPointArray);
        }
 public XchangeDescriptorConfig(IConfiguration config)
 {
     _config              = config.GetSection("ExchangeDescriptors");
     _dataTypes           = XchangeConfigToolkit.GenerateTypeDictionary();
     _exchangeDescriptors = ReadExchangeDescriptorConfiguration(_config);
 }