code: func TransportConstructor(tpt interface{}) (TptC, error) {
  	// Already constructed?
  	if t, ok := tpt.(transport.Transport); ok {
  		return func(_ host.Host, _ *tptu.Upgrader) (transport.Transport, error) {
  			return t, nil
  		}, nil
  	}
  	ctor, err := makeConstructor(tpt, transportType, transportArgTypes)
  	if err != nil {
  		return nil, err
  	}
  	return func(h host.Host, u *tptu.Upgrader) (transport.Transport, error) {
  		t, err := ctor(h, u)
  		if err != nil {
  			return nil, err
  		}
  		return t.(transport.Transport), nil
  	}, nil
  }
docs: // TransportConstructor uses reflection to turn a function that constructs a
  // transport into a TptC.
  //
  // You can pass either a constructed transport (something that implements
  // `transport.Transport`) or a function that takes any of:
  //
  // * The local peer ID.
  // * A transport connection upgrader.
  // * A private key.
  // * A public key.
  // * A Host.
  // * A Network.
  // * A Peerstore.
  // * An address filter.
  // * A security transport.
  // * A stream multiplexer transport.
  // * A private network protector.
  //
  // And returns a type implementing transport.Transport and, optionally, an error
  // (as the second argument).