/// <summary>
        /// Create topology
        /// </summary>
        /// <param name="mainExchangeName">
        ///     The main exchange name.
        /// </param>
        /// <param name="args">
        ///     Wait time in millisesonds for each retry level.
        ///     The number of retry levels is the args array length.</param>
        /// <returns>The created topology</returns>
        public Topology Create(string mainExchangeName, params object[] args)
        {
            if (mainExchangeName is null)
            {
                throw new ArgumentNullException(nameof(mainExchangeName));
            }

            var exchange = new Exchange()
            {
                Name = mainExchangeName
            };

            var exchanges = new List <Exchange>
            {
                exchange
            };

            var queueRetryPackBuilder = new QueueRetryPackBuilder();

            exchanges.AddRange(
                queueRetryPackBuilder.Create(exchange, mainExchangeName, args));

            return(new Topology()
            {
                Exchanges = exchanges
            });
        }
        /// <summary>
        /// Create topology
        /// </summary>
        /// <param name="mainExchangeName">
        ///     The main exchange name.
        /// </param>
        /// <param name="args">
        ///     Names of queues (string) to send/funout published messages.
        ///     Wait times in millisesonds (int) for each retry level.
        ///     The number of retry levels is the number of int args.
        /// </param>
        /// <returns>The created topology</returns>
        public Topology Create(string mainExchangeName, params object[] args)
        {
            if (mainExchangeName is null)
            {
                throw new ArgumentNullException(nameof(mainExchangeName));
            }

            var(queueNames, retryDelaysMilliseconds) = ReadArguments(args);

            var exchange = new Exchange()
            {
                Name = mainExchangeName,
                Type = ExchangeType.Fanout
            };

            var exchanges = new List <Exchange>
            {
                exchange
            };

            var queueRetryPackBuilder = new QueueRetryPackBuilder();

            foreach (var queue in queueNames)
            {
                exchanges.AddRange(
                    queueRetryPackBuilder.Create(exchange, queue,
                                                 retryDelaysMilliseconds.ToArray()));
            }

            return(new Topology()
            {
                Exchanges = exchanges
            });
        }