// 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"

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

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

		timeout: cr.DefaultTimeout,
	}
}

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

		timeout: timeout,
	}
}

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

		Context: ctx,
	}
}

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

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

	/*ID*/
	ID string

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

// WithTimeout adds the timeout to the tenancy choices read params
func (o *TenancyChoicesReadParams) WithTimeout(timeout time.Duration) *TenancyChoicesReadParams {
	o.SetTimeout(timeout)
	return o
}

// SetTimeout adds the timeout to the tenancy choices read params
func (o *TenancyChoicesReadParams) SetTimeout(timeout time.Duration) {
	o.timeout = timeout
}

// WithContext adds the context to the tenancy choices read params
func (o *TenancyChoicesReadParams) WithContext(ctx context.Context) *TenancyChoicesReadParams {
	o.SetContext(ctx)
	return o
}

// SetContext adds the context to the tenancy choices read params
func (o *TenancyChoicesReadParams) SetContext(ctx context.Context) {
	o.Context = ctx
}

// WithHTTPClient adds the HTTPClient to the tenancy choices read params
func (o *TenancyChoicesReadParams) WithHTTPClient(client *http.Client) *TenancyChoicesReadParams {
	o.SetHTTPClient(client)
	return o
}

// SetHTTPClient adds the HTTPClient to the tenancy choices read params
func (o *TenancyChoicesReadParams) SetHTTPClient(client *http.Client) {
	o.HTTPClient = client
}

// WithID adds the id to the tenancy choices read params
func (o *TenancyChoicesReadParams) WithID(id string) *TenancyChoicesReadParams {
	o.SetID(id)
	return o
}

// SetID adds the id to the tenancy choices read params
func (o *TenancyChoicesReadParams) SetID(id string) {
	o.ID = id
}

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

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

	// path param id
	if err := r.SetPathParam("id", o.ID); err != nil {
		return err
	}

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