// Code generated by go-swagger; DO NOT EDIT.

// Copyright 2018 The go-netbox Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package tenancy

// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command

import (
	"net/http"
	"time"

	"golang.org/x/net/context"

	"github.com/go-openapi/errors"
	"github.com/go-openapi/runtime"
	cr "github.com/go-openapi/runtime/client"
	"github.com/go-openapi/swag"

	strfmt "github.com/go-openapi/strfmt"
)

// NewTenancyTenantsListParams creates a new TenancyTenantsListParams object
// with the default values initialized.
func NewTenancyTenantsListParams() *TenancyTenantsListParams {
	var ()
	return &TenancyTenantsListParams{

		timeout: cr.DefaultTimeout,
	}
}

// NewTenancyTenantsListParamsWithTimeout creates a new TenancyTenantsListParams object
// with the default values initialized, and the ability to set a timeout on a request
func NewTenancyTenantsListParamsWithTimeout(timeout time.Duration) *TenancyTenantsListParams {
	var ()
	return &TenancyTenantsListParams{

		timeout: timeout,
	}
}

// NewTenancyTenantsListParamsWithContext creates a new TenancyTenantsListParams object
// with the default values initialized, and the ability to set a context for a request
func NewTenancyTenantsListParamsWithContext(ctx context.Context) *TenancyTenantsListParams {
	var ()
	return &TenancyTenantsListParams{

		Context: ctx,
	}
}

// NewTenancyTenantsListParamsWithHTTPClient creates a new TenancyTenantsListParams object
// with the default values initialized, and the ability to set a custom HTTPClient for a request
func NewTenancyTenantsListParamsWithHTTPClient(client *http.Client) *TenancyTenantsListParams {
	var ()
	return &TenancyTenantsListParams{
		HTTPClient: client,
	}
}

/*TenancyTenantsListParams contains all the parameters to send to the API endpoint
for the tenancy tenants list operation typically these are written to a http.Request
*/
type TenancyTenantsListParams struct {

	/*Group*/
	Group *string
	/*GroupID*/
	GroupID *string
	/*IDIn
	  Multiple values may be separated by commas.

	*/
	IDIn *string
	/*Limit
	  Number of results to return per page.

	*/
	Limit *int64
	/*Name*/
	Name *string
	/*Offset
	  The initial index from which to return the results.

	*/
	Offset *int64
	/*Q*/
	Q *string

	timeout    time.Duration
	Context    context.Context
	HTTPClient *http.Client
}

// WithTimeout adds the timeout to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithTimeout(timeout time.Duration) *TenancyTenantsListParams {
	o.SetTimeout(timeout)
	return o
}

// SetTimeout adds the timeout to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetTimeout(timeout time.Duration) {
	o.timeout = timeout
}

// WithContext adds the context to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithContext(ctx context.Context) *TenancyTenantsListParams {
	o.SetContext(ctx)
	return o
}

// SetContext adds the context to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetContext(ctx context.Context) {
	o.Context = ctx
}

// WithHTTPClient adds the HTTPClient to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithHTTPClient(client *http.Client) *TenancyTenantsListParams {
	o.SetHTTPClient(client)
	return o
}

// SetHTTPClient adds the HTTPClient to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetHTTPClient(client *http.Client) {
	o.HTTPClient = client
}

// WithGroup adds the group to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithGroup(group *string) *TenancyTenantsListParams {
	o.SetGroup(group)
	return o
}

// SetGroup adds the group to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetGroup(group *string) {
	o.Group = group
}

// WithGroupID adds the groupID to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithGroupID(groupID *string) *TenancyTenantsListParams {
	o.SetGroupID(groupID)
	return o
}

// SetGroupID adds the groupId to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetGroupID(groupID *string) {
	o.GroupID = groupID
}

// WithIDIn adds the iDIn to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithIDIn(iDIn *string) *TenancyTenantsListParams {
	o.SetIDIn(iDIn)
	return o
}

// SetIDIn adds the idIn to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetIDIn(iDIn *string) {
	o.IDIn = iDIn
}

// WithLimit adds the limit to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithLimit(limit *int64) *TenancyTenantsListParams {
	o.SetLimit(limit)
	return o
}

// SetLimit adds the limit to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetLimit(limit *int64) {
	o.Limit = limit
}

// WithName adds the name to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithName(name *string) *TenancyTenantsListParams {
	o.SetName(name)
	return o
}

// SetName adds the name to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetName(name *string) {
	o.Name = name
}

// WithOffset adds the offset to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithOffset(offset *int64) *TenancyTenantsListParams {
	o.SetOffset(offset)
	return o
}

// SetOffset adds the offset to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetOffset(offset *int64) {
	o.Offset = offset
}

// WithQ adds the q to the tenancy tenants list params
func (o *TenancyTenantsListParams) WithQ(q *string) *TenancyTenantsListParams {
	o.SetQ(q)
	return o
}

// SetQ adds the q to the tenancy tenants list params
func (o *TenancyTenantsListParams) SetQ(q *string) {
	o.Q = q
}

// WriteToRequest writes these params to a swagger request
func (o *TenancyTenantsListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {

	if err := r.SetTimeout(o.timeout); err != nil {
		return err
	}
	var res []error

	if o.Group != nil {

		// query param group
		var qrGroup string
		if o.Group != nil {
			qrGroup = *o.Group
		}
		qGroup := qrGroup
		if qGroup != "" {
			if err := r.SetQueryParam("group", qGroup); err != nil {
				return err
			}
		}

	}

	if o.GroupID != nil {

		// query param group_id
		var qrGroupID string
		if o.GroupID != nil {
			qrGroupID = *o.GroupID
		}
		qGroupID := qrGroupID
		if qGroupID != "" {
			if err := r.SetQueryParam("group_id", qGroupID); err != nil {
				return err
			}
		}

	}

	if o.IDIn != nil {

		// query param id__in
		var qrIDIn string
		if o.IDIn != nil {
			qrIDIn = *o.IDIn
		}
		qIDIn := qrIDIn
		if qIDIn != "" {
			if err := r.SetQueryParam("id__in", qIDIn); err != nil {
				return err
			}
		}

	}

	if o.Limit != nil {

		// query param limit
		var qrLimit int64
		if o.Limit != nil {
			qrLimit = *o.Limit
		}
		qLimit := swag.FormatInt64(qrLimit)
		if qLimit != "" {
			if err := r.SetQueryParam("limit", qLimit); err != nil {
				return err
			}
		}

	}

	if o.Name != nil {

		// query param name
		var qrName string
		if o.Name != nil {
			qrName = *o.Name
		}
		qName := qrName
		if qName != "" {
			if err := r.SetQueryParam("name", qName); err != nil {
				return err
			}
		}

	}

	if o.Offset != nil {

		// query param offset
		var qrOffset int64
		if o.Offset != nil {
			qrOffset = *o.Offset
		}
		qOffset := swag.FormatInt64(qrOffset)
		if qOffset != "" {
			if err := r.SetQueryParam("offset", qOffset); err != nil {
				return err
			}
		}

	}

	if o.Q != nil {

		// query param q
		var qrQ string
		if o.Q != nil {
			qrQ = *o.Q
		}
		qQ := qrQ
		if qQ != "" {
			if err := r.SetQueryParam("q", qQ); err != nil {
				return err
			}
		}

	}

	if len(res) > 0 {
		return errors.CompositeValidationError(res...)
	}
	return nil
}
