code: func FromParameters(parameters map[string]interface{}) (*Driver, error) {
  	params := Parameters{
  		ChunkSize:          defaultChunkSize,
  		InsecureSkipVerify: false,
  	}
  
  	// Sanitize some entries before trying to decode parameters with mapstructure
  	// TenantID and Tenant when integers only and passed as ENV variables
  	// are considered as integer and not string. The parser fails in this
  	// case.
  	_, ok := parameters["tenant"]
  	if ok {
  		parameters["tenant"] = fmt.Sprint(parameters["tenant"])
  	}
  	_, ok = parameters["tenantid"]
  	if ok {
  		parameters["tenantid"] = fmt.Sprint(parameters["tenantid"])
  	}
  
  	if err := mapstructure.Decode(parameters, &params); err != nil {
  		return nil, err
  	}
  
  	if params.Username == "" {
  		return nil, fmt.Errorf("no username parameter provided")
  	}
  
  	if params.Password == "" {
  		return nil, fmt.Errorf("no password parameter provided")
  	}
  
  	if params.AuthURL == "" {
  		return nil, fmt.Errorf("no authurl parameter provided")
  	}
  
  	if params.Container == "" {
  		return nil, fmt.Errorf("no container parameter provided")
  	}
  
  	if params.ChunkSize < minChunkSize {
  		return nil, fmt.Errorf("the chunksize %#v parameter should be a number that is larger than or equal to %d", params.ChunkSize, minChunkSize)
  	}
  
  	return New(params)
  }
docs: // FromParameters constructs a new Driver with a given parameters map
  // Required parameters:
  // - username
  // - password
  // - authurl
  // - container