code: func New(dsn string, options ...Option) (*Rabbus, error) {
  	r := &Rabbus{
  		emit:       make(chan Message),
  		emitErr:    make(chan error),
  		emitOk:     make(chan struct{}),
  		reconn:     make(chan struct{}),
  		exDeclared: make(map[string]struct{}),
  	}
  
  	for _, o := range options {
  		if err := o(r); err != nil {
  			return nil, err
  		}
  	}
  
  	if r.Amqp == nil {
  		amqpWrapper, err := amqpWrap.New(dsn, r.config.isExchangePassive)
  		if err != nil {
  			return nil, err
  		}
  		r.Amqp = amqpWrapper
  	}
  
  	if err := r.WithQos(
  		r.config.qos.prefetchCount,
  		r.config.qos.prefetchSize,
  		r.config.qos.global,
  	); err != nil {
  		return nil, err
  	}
  
  	r.config.dsn = dsn
  	r.breaker = gobreaker.NewCircuitBreaker(newBreakerSettings(r.config))
  
  	return r, nil
  }
docs: // New returns a new Rabbus configured with the
  // variables from the config parameter, or returning an non-nil err
  // if an error occurred while creating connection and channel.