Пример #1
0
        public static ZyRabbitConfiguration Parse(string connectionString)
        {
            var mainMatch = MainRegex.Match(connectionString);
            var port      = Defaults.Port;

            if (RegexMatchGroupIsNonEmpty(mainMatch, "port"))
            {
                var suppliedPort = mainMatch.Groups["port"].Value;
                if (!int.TryParse(suppliedPort, out port))
                {
                    throw new FormatException($"The supplied port '{suppliedPort}' in the connection string is not a number");
                }
            }

            var cfg = new ZyRabbitConfiguration
            {
                Username    = RegexMatchGroupIsNonEmpty(mainMatch, "username") ? mainMatch.Groups["username"].Value : Defaults.Username,
                Password    = RegexMatchGroupIsNonEmpty(mainMatch, "password") ? mainMatch.Groups["password"].Value : Defaults.Password,
                Hostnames   = mainMatch.Groups["hosts"].Value.Split(',').ToList(),
                Port        = port,
                VirtualHost = ExctractVirutalHost(mainMatch)
            };

            var parametersMatches = ParametersRegex.Matches(mainMatch.Groups["parameters"].Value);

            foreach (Match match in parametersMatches)
            {
                var name         = match.Groups["name"].Value.ToLower();
                var val          = match.Groups["value"].Value.ToLower();
                var propertyInfo = cfg
                                   .GetType()
                                   .GetTypeInfo()
                                   .GetProperty(name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);

                if (propertyInfo == null)
                {
                    throw new ArgumentException($"No configuration property named '{name}'");
                }

                if (propertyInfo.PropertyType == typeof(TimeSpan))
                {
                    var convertedValue = TimeSpan.FromSeconds(int.Parse(val));
                    propertyInfo.SetValue(cfg, convertedValue, null);
                }
                else
                {
                    propertyInfo.SetValue(cfg, Convert.ChangeType(val, propertyInfo.PropertyType), null);
                }
            }

            return(cfg);
        }