// Copyright 2020 Google LLC.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated file. DO NOT EDIT.

// Package customsearch provides access to the Custom Search API.
//
// For product documentation, see: https://developers.google.com/custom-search/v1/introduction
//
// Creating a client
//
// Usage example:
//
//   import "google.golang.org/api/customsearch/v1"
//   ...
//   ctx := context.Background()
//   customsearchService, err := customsearch.NewService(ctx)
//
// In this example, Google Application Default Credentials are used for authentication.
//
// For information on how to create and obtain Application Default Credentials, see https://developers.google.com/identity/protocols/application-default-credentials.
//
// Other authentication options
//
// To use an API key for authentication (note: some APIs do not support API keys), use option.WithAPIKey:
//
//   customsearchService, err := customsearch.NewService(ctx, option.WithAPIKey("AIza..."))
//
// To use an OAuth token (e.g., a user token obtained via a three-legged OAuth flow), use option.WithTokenSource:
//
//   config := &oauth2.Config{...}
//   // ...
//   token, err := config.Exchange(ctx, ...)
//   customsearchService, err := customsearch.NewService(ctx, option.WithTokenSource(config.TokenSource(ctx, token)))
//
// See https://godoc.org/google.golang.org/api/option/ for details on options.
package customsearch // import "google.golang.org/api/customsearch/v1"

import (
	"bytes"
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"strconv"
	"strings"

	googleapi "google.golang.org/api/googleapi"
	gensupport "google.golang.org/api/internal/gensupport"
	option "google.golang.org/api/option"
	internaloption "google.golang.org/api/option/internaloption"
	htransport "google.golang.org/api/transport/http"
)

// Always reference these packages, just in case the auto-generated code
// below doesn't.
var _ = bytes.NewBuffer
var _ = strconv.Itoa
var _ = fmt.Sprintf
var _ = json.NewDecoder
var _ = io.Copy
var _ = url.Parse
var _ = gensupport.MarshalJSON
var _ = googleapi.Version
var _ = errors.New
var _ = strings.Replace
var _ = context.Canceled
var _ = internaloption.WithDefaultEndpoint

const apiId = "customsearch:v1"
const apiName = "customsearch"
const apiVersion = "v1"
const basePath = "https://customsearch.googleapis.com/"

// NewService creates a new Service.
func NewService(ctx context.Context, opts ...option.ClientOption) (*Service, error) {
	opts = append(opts, internaloption.WithDefaultEndpoint(basePath))
	client, endpoint, err := htransport.NewClient(ctx, opts...)
	if err != nil {
		return nil, err
	}
	s, err := New(client)
	if err != nil {
		return nil, err
	}
	if endpoint != "" {
		s.BasePath = endpoint
	}
	return s, nil
}

// New creates a new Service. It uses the provided http.Client for requests.
//
// Deprecated: please use NewService instead.
// To provide a custom HTTP client, use option.WithHTTPClient.
// If you are using google.golang.org/api/googleapis/transport.APIKey, use option.WithAPIKey with NewService instead.
func New(client *http.Client) (*Service, error) {
	if client == nil {
		return nil, errors.New("client is nil")
	}
	s := &Service{client: client, BasePath: basePath}
	s.Cse = NewCseService(s)
	return s, nil
}

type Service struct {
	client    *http.Client
	BasePath  string // API endpoint base URL
	UserAgent string // optional additional User-Agent fragment

	Cse *CseService
}

func (s *Service) userAgent() string {
	if s.UserAgent == "" {
		return googleapi.UserAgent
	}
	return googleapi.UserAgent + " " + s.UserAgent
}

func NewCseService(s *Service) *CseService {
	rs := &CseService{s: s}
	rs.Siterestrict = NewCseSiterestrictService(s)
	return rs
}

type CseService struct {
	s *Service

	Siterestrict *CseSiterestrictService
}

func NewCseSiterestrictService(s *Service) *CseSiterestrictService {
	rs := &CseSiterestrictService{s: s}
	return rs
}

type CseSiterestrictService struct {
	s *Service
}

// Promotion: Promotion result.
type Promotion struct {
	// BodyLines: An array of block objects for this promotion. See [Google
	// WebSearch
	// Protocol
	// reference](https://developers.google.com/custom-sea
	// rch/docs/xml_results)
	// for more information.
	BodyLines []*PromotionBodyLines `json:"bodyLines,omitempty"`

	// DisplayLink: An abridged version of this search's result URL, e.g.
	// www.example.com.
	DisplayLink string `json:"displayLink,omitempty"`

	// HtmlTitle: The title of the promotion, in HTML.
	HtmlTitle string `json:"htmlTitle,omitempty"`

	// Image: Image belonging to a promotion.
	Image *PromotionImage `json:"image,omitempty"`

	// Link: The URL of the promotion.
	Link string `json:"link,omitempty"`

	// Title: The title of the promotion.
	Title string `json:"title,omitempty"`

	// ForceSendFields is a list of field names (e.g. "BodyLines") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "BodyLines") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Promotion) MarshalJSON() ([]byte, error) {
	type NoMethod Promotion
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// PromotionBodyLines: Block object belonging to a promotion.
type PromotionBodyLines struct {
	// HtmlTitle: The block object's text in HTML, if it has text.
	HtmlTitle string `json:"htmlTitle,omitempty"`

	// Link: The anchor text of the block object's link, if it has a link.
	Link string `json:"link,omitempty"`

	// Title: The block object's text, if it has text.
	Title string `json:"title,omitempty"`

	// Url: The URL of the block object's link, if it has one.
	Url string `json:"url,omitempty"`

	// ForceSendFields is a list of field names (e.g. "HtmlTitle") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "HtmlTitle") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *PromotionBodyLines) MarshalJSON() ([]byte, error) {
	type NoMethod PromotionBodyLines
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// PromotionImage: Image belonging to a promotion.
type PromotionImage struct {
	// Height: Image height in pixels.
	Height int64 `json:"height,omitempty"`

	// Source: URL of the image for this promotion link.
	Source string `json:"source,omitempty"`

	// Width: Image width in pixels.
	Width int64 `json:"width,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Height") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Height") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *PromotionImage) MarshalJSON() ([]byte, error) {
	type NoMethod PromotionImage
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// Result: A custom search result.
type Result struct {
	// CacheId: Indicates the ID of Google's cached version of the search
	// result.
	CacheId string `json:"cacheId,omitempty"`

	// DisplayLink: An abridged version of this search result’s URL, e.g.
	// www.example.com.
	DisplayLink string `json:"displayLink,omitempty"`

	// FileFormat: The file format of the search result.
	FileFormat string `json:"fileFormat,omitempty"`

	// FormattedUrl: The URL displayed after the snippet for each search
	// result.
	FormattedUrl string `json:"formattedUrl,omitempty"`

	// HtmlFormattedUrl: The HTML-formatted URL displayed after the snippet
	// for each search result.
	HtmlFormattedUrl string `json:"htmlFormattedUrl,omitempty"`

	// HtmlSnippet: The snippet of the search result, in HTML.
	HtmlSnippet string `json:"htmlSnippet,omitempty"`

	// HtmlTitle: The title of the search result, in HTML.
	HtmlTitle string `json:"htmlTitle,omitempty"`

	// Image: Image belonging to a custom search result.
	Image *ResultImage `json:"image,omitempty"`

	// Kind: A unique identifier for the type of current object. For this
	// API, it is
	// `customsearch#result.`
	Kind string `json:"kind,omitempty"`

	// Labels: Encapsulates all information about
	// [refinement
	// labels](https://developers.google.com/custom-search/docs/x
	// ml_results).
	Labels []*ResultLabels `json:"labels,omitempty"`

	// Link: The full URL to which the search result is pointing,
	// e.g.
	// http://www.example.com/foo/bar.
	Link string `json:"link,omitempty"`

	// Mime: The MIME type of the search result.
	Mime string `json:"mime,omitempty"`

	// Pagemap:
	// Contains
	// [PageMap](https://developers.google.com/custom-search/docs/st
	// ructured_data#pagemaps)
	// information for this search result.
	Pagemap googleapi.RawMessage `json:"pagemap,omitempty"`

	// Snippet: The snippet of the search result, in plain text.
	Snippet string `json:"snippet,omitempty"`

	// Title: The title of the search result, in plain text.
	Title string `json:"title,omitempty"`

	// ForceSendFields is a list of field names (e.g. "CacheId") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "CacheId") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Result) MarshalJSON() ([]byte, error) {
	type NoMethod Result
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ResultImage: Image belonging to a custom search result.
type ResultImage struct {
	// ByteSize: The size of the image, in pixels.
	ByteSize int64 `json:"byteSize,omitempty"`

	// ContextLink: A URL pointing to the webpage hosting the image.
	ContextLink string `json:"contextLink,omitempty"`

	// Height: The height of the image, in pixels.
	Height int64 `json:"height,omitempty"`

	// ThumbnailHeight: The height of the thumbnail image, in pixels.
	ThumbnailHeight int64 `json:"thumbnailHeight,omitempty"`

	// ThumbnailLink: A URL to the thumbnail image.
	ThumbnailLink string `json:"thumbnailLink,omitempty"`

	// ThumbnailWidth: The width of the thumbnail image, in pixels.
	ThumbnailWidth int64 `json:"thumbnailWidth,omitempty"`

	// Width: The width of the image, in pixels.
	Width int64 `json:"width,omitempty"`

	// ForceSendFields is a list of field names (e.g. "ByteSize") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "ByteSize") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ResultImage) MarshalJSON() ([]byte, error) {
	type NoMethod ResultImage
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ResultLabels: Refinement label associated with a custom search
// result.
type ResultLabels struct {
	// DisplayName: The display name of a refinement label. This is the name
	// you should
	// display in your user interface.
	DisplayName string `json:"displayName,omitempty"`

	// LabelWithOp: Refinement label and the associated refinement
	// operation.
	LabelWithOp string `json:"label_with_op,omitempty"`

	// Name: The name of a refinement label, which you can use to refine
	// searches.
	// Don't display this in your user interface; instead, use displayName.
	Name string `json:"name,omitempty"`

	// ForceSendFields is a list of field names (e.g. "DisplayName") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "DisplayName") to include
	// in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. However, any field with
	// an empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ResultLabels) MarshalJSON() ([]byte, error) {
	type NoMethod ResultLabels
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// Search: Response to a custom search request.
type Search struct {
	// Context: Metadata and refinements associated with the given search
	// engine,
	// including:
	//
	// * The name of the search engine that was used for the query.
	//
	// *   A set of
	// [facet
	// objects](https://developers.google.com/custom-search/docs/refin
	// ements#create)
	// (refinements) you can use for refining a search.
	Context googleapi.RawMessage `json:"context,omitempty"`

	// Items: The current set of custom search results.
	Items []*Result `json:"items,omitempty"`

	// Kind: Unique identifier for the type of current object. For this API,
	// it is
	// customsearch#search.
	Kind string `json:"kind,omitempty"`

	// Promotions: The set
	// of
	// [promotions](https://developers.google.com/custom-search/docs/promo
	// tions).
	// Present only if the custom search engine's configuration files define
	// any
	// promotions for the given query.
	Promotions []*Promotion `json:"promotions,omitempty"`

	// Queries: Query metadata for the previous, current, and next pages of
	// results.
	Queries *SearchQueries `json:"queries,omitempty"`

	// SearchInformation: Metadata about a search operation.
	SearchInformation *SearchSearchInformation `json:"searchInformation,omitempty"`

	// Spelling: Spell correction information for a query.
	Spelling *SearchSpelling `json:"spelling,omitempty"`

	// Url: OpenSearch template and URL.
	Url *SearchUrl `json:"url,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the
	// server.
	googleapi.ServerResponse `json:"-"`

	// ForceSendFields is a list of field names (e.g. "Context") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Context") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Search) MarshalJSON() ([]byte, error) {
	type NoMethod Search
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// SearchQueries: Query metadata for the previous, current, and next
// pages of results.
type SearchQueries struct {
	// NextPage: Metadata representing the next page of results, if
	// applicable.
	NextPage []*SearchQueriesNextPage `json:"nextPage,omitempty"`

	// PreviousPage: Metadata representing the previous page of results, if
	// applicable.
	PreviousPage []*SearchQueriesPreviousPage `json:"previousPage,omitempty"`

	// Request: Metadata representing the current request.
	Request []*SearchQueriesRequest `json:"request,omitempty"`

	// ForceSendFields is a list of field names (e.g. "NextPage") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "NextPage") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *SearchQueries) MarshalJSON() ([]byte, error) {
	type NoMethod SearchQueries
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// SearchQueriesNextPage: Custom search request metadata.
type SearchQueriesNextPage struct {
	// Count: Number of search results returned in this set.
	Count int64 `json:"count,omitempty"`

	// Cr: Restricts search results to documents originating in a
	// particular
	// country. You may use
	// [Boolean
	// operators](https://developers.google.com/custom-search/docs/x
	// ml_results#booleanOperators)
	// in the `cr` parameter's value.
	//
	// Google WebSearch determines the country of a document by analyzing
	// the
	// following:
	//
	// * The top-level domain (TLD) of the document's URL.
	//
	// * The geographic location of the web server's IP address.
	//
	// See [Country (cr)
	// Parameter
	// Values](https://developers.google.com/custom-search/docs/xml
	// _results#countryCollections)
	// for a list of valid values for this parameter.
	Cr string `json:"cr,omitempty"`

	// Cx: The identifier of a custom search engine created using the Custom
	// Search
	// [Control Panel](https://cse.google.com/). This is a custom property
	// not
	// defined in the OpenSearch spec. This parameter is **required**.
	Cx string `json:"cx,omitempty"`

	// DateRestrict: Restricts results to URLs based on date. Supported
	// values include:
	//
	// * `d[number]`: requests results from the specified number of past
	// days.
	//
	// * `w[number]`: requests results from the specified number of past
	// weeks.
	//
	// * `m[number]`: requests results from the specified number of past
	// months.
	//
	// * `y[number]`: requests results from the specified number of past
	// years.
	DateRestrict string `json:"dateRestrict,omitempty"`

	// DisableCnTwTranslation: Enables or disables the [Simplified and
	// Traditional
	// Chinese
	// Search](https://developers.google.com/custom-search/docs/xml_r
	// esults#chineseSearch)
	// feature.
	//
	// Supported values are:
	//
	// * `0`: enabled (default)
	//
	// * `1`: disabled
	DisableCnTwTranslation string `json:"disableCnTwTranslation,omitempty"`

	// ExactTerms: Identifies a phrase that all documents in the search
	// results must
	// contain.
	ExactTerms string `json:"exactTerms,omitempty"`

	// ExcludeTerms: Identifies a word or phrase that should not appear in
	// any documents in
	// the search results.
	ExcludeTerms string `json:"excludeTerms,omitempty"`

	// FileType: Restricts results to files of a specified extension.
	// Filetypes supported
	// by Google include:
	//
	// * Adobe Portable Document Format (`pdf`)
	//
	// * Adobe PostScript (`ps`)
	//
	// * Lotus 1-2-3 (`wk1`, `wk2`, `wk3`, `wk4`, `wk5`, `wki`, `wks`,
	// `wku`)
	//
	// * Lotus WordPro (`lwp`)
	//
	// * Macwrite (`mw`)
	//
	// * Microsoft Excel (`xls`)
	//
	// * Microsoft PowerPoint (`ppt`)
	//
	// * Microsoft Word (`doc`)
	//
	// * Microsoft Works (`wks`, `wps`, `wdb`)
	//
	// * Microsoft Write (`wri`)
	//
	// * Rich Text Format (`rtf`)
	//
	// * Shockwave Flash (`swf`)
	//
	// * Text (`ans`, `txt`).
	//
	// Additional filetypes may be added in the future. An up-to-date list
	// can
	// always be found in Google's [file
	// type
	// FAQ](https://support.google.com/webmasters/answer/35287).
	FileType string `json:"fileType,omitempty"`

	// Filter: Activates or deactivates the automatic filtering of Google
	// search
	// results. See
	// [Automatic
	// Filtering](https://developers.google.com/custom-search/docs
	// /xml_results#automaticFiltering)
	// for more information about Google's search results filters. Valid
	// values
	// for this parameter are:
	//
	// * `0`: Disabled
	//
	// * `1`: Enabled (default)
	//
	// **Note**: By default, Google applies filtering to all search results
	// to
	// improve the quality of those results.
	Filter string `json:"filter,omitempty"`

	// Gl: Boosts search results whose country of origin matches the
	// parameter
	// value. See
	// [Country
	// Codes](https://developers.google.com/custom-search/docs/xml_r
	// esults#countryCodes)
	// for a list of valid values.
	//
	// Specifying a `gl` parameter value in WebSearch requests should
	// improve
	// the relevance of results. This is particularly true for
	// international
	// customers and, even more specifically, for customers in
	// English-speaking
	// countries other than the United States.
	Gl string `json:"gl,omitempty"`

	// GoogleHost: Specifies the Google domain (for example, google.com,
	// google.de, or
	// google.fr) to which the search should be limited.
	GoogleHost string `json:"googleHost,omitempty"`

	// HighRange: Specifies the ending value for a search range. Use
	// `cse:lowRange` and
	// `cse:highrange` to append an inclusive search range
	// of
	// `lowRange...highRange` to the query.
	HighRange string `json:"highRange,omitempty"`

	// Hl: Specifies the interface language (host language) of your user
	// interface.
	// Explicitly setting this parameter improves the performance and
	// the
	// quality of your search results.
	//
	// See the
	// [Interface
	// Languages](https://developers.google.com/custom-search/docs
	// /xml_results#wsInterfaceLanguages)
	// section of [Internationalizing Queries and
	// Results
	// Presentation](https://developers.google.com/custom-search/docs
	// /xml_results#wsInternationalizing)
	// for more information, and [Supported
	// Interface
	// Languages](https://developers.google.com/custom-search/docs/
	// xml_results_appendices#interfaceLanguages)
	// for a list of supported languages.
	Hl string `json:"hl,omitempty"`

	// Hq: Appends the specified query terms to the query, as if they were
	// combined
	// with a logical `AND` operator.
	Hq string `json:"hq,omitempty"`

	// ImgColorType: Restricts results to images of a specified color type.
	// Supported values
	//   are:
	//
	// * `mono` (black and white)
	//
	// * `gray` (grayscale)
	//
	// * `color` (color)
	ImgColorType string `json:"imgColorType,omitempty"`

	// ImgDominantColor: Restricts results to images with a specific
	// dominant color. Supported
	// values are:
	//
	// * `red`
	//
	// * `orange`
	//
	// * `yellow`
	//
	// * `green`
	//
	// * `teal`
	//
	// * `blue`
	//
	// * `purple`
	//
	// * `pink`
	//
	// * `white`
	//
	// * `gray`
	//
	// * `black`
	//
	// * `brown`
	ImgDominantColor string `json:"imgDominantColor,omitempty"`

	// ImgSize: Restricts results to images of a specified size. Supported
	// values are:
	//
	// * `icon` (small)
	//
	// * `small | medium | large | xlarge` (medium)
	//
	// * `xxlarge` (large)
	//
	// * `huge` (extra-large)
	ImgSize string `json:"imgSize,omitempty"`

	// ImgType: Restricts results to images of a specified type. Supported
	// values are:
	//
	// * `clipart` (Clip art)
	//
	// * `face` (Face)
	//
	// * `lineart` (Line drawing)
	//
	// * `photo` (Photo)
	//
	// * `animated` (Animated)
	//
	// * `stock` (Stock)
	ImgType string `json:"imgType,omitempty"`

	// InputEncoding: The character encoding supported for search requests.
	InputEncoding string `json:"inputEncoding,omitempty"`

	// Language: The language of the search results.
	Language string `json:"language,omitempty"`

	// LinkSite: Specifies that all results should contain a link to a
	// specific URL.
	LinkSite string `json:"linkSite,omitempty"`

	// LowRange: Specifies the starting value for a search range. Use
	// `cse:lowRange` and
	// `cse:highrange` to append an inclusive search range
	// of
	// `lowRange...highRange` to the query.
	LowRange string `json:"lowRange,omitempty"`

	// OrTerms: Provides additional search terms to check for in a document,
	// where each
	// document in the search results must contain at least one of
	// the
	// additional search terms. You can also use the
	// [Boolean
	// OR](https://developers.google.com/custom-search/docs/xml_resu
	// lts#BooleanOrqt)
	// query term for this type of query.
	OrTerms string `json:"orTerms,omitempty"`

	// OutputEncoding: The character encoding supported for search results.
	OutputEncoding string `json:"outputEncoding,omitempty"`

	// RelatedSite: Specifies that all search results should be pages that
	// are related to the
	// specified URL. The parameter value should be a URL.
	RelatedSite string `json:"relatedSite,omitempty"`

	// Rights: Filters based on licensing. Supported values include:
	//
	// * `cc_publicdomain`
	//
	// * `cc_attribute`
	//
	// * `cc_sharealike`
	//
	// * `cc_noncommercial`
	//
	// * `cc_nonderived`
	Rights string `json:"rights,omitempty"`

	// Safe: Specifies the
	// [SafeSearch
	// level](https://developers.google.com/custom-search/docs/xm
	// l_results#safeSearchLevels)
	// used for filtering out adult results. This is a custom property
	// not
	// defined in the OpenSearch spec. Valid parameter values are:
	//
	// * "off": Disable SafeSearch
	//
	// * "active": Enable SafeSearch
	Safe string `json:"safe,omitempty"`

	// SearchTerms: The search terms entered by the user.
	SearchTerms string `json:"searchTerms,omitempty"`

	// SearchType: Allowed values are `web` or `image`. If unspecified,
	// results are limited
	// to webpages.
	SearchType string `json:"searchType,omitempty"`

	// SiteSearch: Restricts results to URLs from a specified site.
	SiteSearch string `json:"siteSearch,omitempty"`

	// SiteSearchFilter: Specifies whether to include or exclude results
	// from the site named in
	// the `sitesearch` parameter. Supported values are:
	//
	// * `i`: include content from site
	//
	// * `e`: exclude content from site
	SiteSearchFilter string `json:"siteSearchFilter,omitempty"`

	// Sort: Specifies that results should be sorted according to the
	// specified
	// expression. For example, sort by date.
	Sort string `json:"sort,omitempty"`

	// StartIndex: The index of the current set of search results into the
	// total set of
	// results, where the index of the first result is 1.
	StartIndex int64 `json:"startIndex,omitempty"`

	// StartPage: The page number of this set of results, where the page
	// length is set by
	// the `count` property.
	StartPage int64 `json:"startPage,omitempty"`

	// Title: A description of the query.
	Title string `json:"title,omitempty"`

	// TotalResults: Estimated number of total search results. May not be
	// accurate.
	TotalResults int64 `json:"totalResults,omitempty,string"`

	// ForceSendFields is a list of field names (e.g. "Count") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Count") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *SearchQueriesNextPage) MarshalJSON() ([]byte, error) {
	type NoMethod SearchQueriesNextPage
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// SearchQueriesPreviousPage: Custom search request metadata.
type SearchQueriesPreviousPage struct {
	// Count: Number of search results returned in this set.
	Count int64 `json:"count,omitempty"`

	// Cr: Restricts search results to documents originating in a
	// particular
	// country. You may use
	// [Boolean
	// operators](https://developers.google.com/custom-search/docs/x
	// ml_results#booleanOperators)
	// in the `cr` parameter's value.
	//
	// Google WebSearch determines the country of a document by analyzing
	// the
	// following:
	//
	// * The top-level domain (TLD) of the document's URL.
	//
	// * The geographic location of the web server's IP address.
	//
	// See [Country (cr)
	// Parameter
	// Values](https://developers.google.com/custom-search/docs/xml
	// _results#countryCollections)
	// for a list of valid values for this parameter.
	Cr string `json:"cr,omitempty"`

	// Cx: The identifier of a custom search engine created using the Custom
	// Search
	// [Control Panel](https://cse.google.com/). This is a custom property
	// not
	// defined in the OpenSearch spec. This parameter is **required**.
	Cx string `json:"cx,omitempty"`

	// DateRestrict: Restricts results to URLs based on date. Supported
	// values include:
	//
	// * `d[number]`: requests results from the specified number of past
	// days.
	//
	// * `w[number]`: requests results from the specified number of past
	// weeks.
	//
	// * `m[number]`: requests results from the specified number of past
	// months.
	//
	// * `y[number]`: requests results from the specified number of past
	// years.
	DateRestrict string `json:"dateRestrict,omitempty"`

	// DisableCnTwTranslation: Enables or disables the [Simplified and
	// Traditional
	// Chinese
	// Search](https://developers.google.com/custom-search/docs/xml_r
	// esults#chineseSearch)
	// feature.
	//
	// Supported values are:
	//
	// * `0`: enabled (default)
	//
	// * `1`: disabled
	DisableCnTwTranslation string `json:"disableCnTwTranslation,omitempty"`

	// ExactTerms: Identifies a phrase that all documents in the search
	// results must
	// contain.
	ExactTerms string `json:"exactTerms,omitempty"`

	// ExcludeTerms: Identifies a word or phrase that should not appear in
	// any documents in
	// the search results.
	ExcludeTerms string `json:"excludeTerms,omitempty"`

	// FileType: Restricts results to files of a specified extension.
	// Filetypes supported
	// by Google include:
	//
	// * Adobe Portable Document Format (`pdf`)
	//
	// * Adobe PostScript (`ps`)
	//
	// * Lotus 1-2-3 (`wk1`, `wk2`, `wk3`, `wk4`, `wk5`, `wki`, `wks`,
	// `wku`)
	//
	// * Lotus WordPro (`lwp`)
	//
	// * Macwrite (`mw`)
	//
	// * Microsoft Excel (`xls`)
	//
	// * Microsoft PowerPoint (`ppt`)
	//
	// * Microsoft Word (`doc`)
	//
	// * Microsoft Works (`wks`, `wps`, `wdb`)
	//
	// * Microsoft Write (`wri`)
	//
	// * Rich Text Format (`rtf`)
	//
	// * Shockwave Flash (`swf`)
	//
	// * Text (`ans`, `txt`).
	//
	// Additional filetypes may be added in the future. An up-to-date list
	// can
	// always be found in Google's [file
	// type
	// FAQ](https://support.google.com/webmasters/answer/35287).
	FileType string `json:"fileType,omitempty"`

	// Filter: Activates or deactivates the automatic filtering of Google
	// search
	// results. See
	// [Automatic
	// Filtering](https://developers.google.com/custom-search/docs
	// /xml_results#automaticFiltering)
	// for more information about Google's search results filters. Valid
	// values
	// for this parameter are:
	//
	// * `0`: Disabled
	//
	// * `1`: Enabled (default)
	//
	// **Note**: By default, Google applies filtering to all search results
	// to
	// improve the quality of those results.
	Filter string `json:"filter,omitempty"`

	// Gl: Boosts search results whose country of origin matches the
	// parameter
	// value. See
	// [Country
	// Codes](https://developers.google.com/custom-search/docs/xml_r
	// esults#countryCodes)
	// for a list of valid values.
	//
	// Specifying a `gl` parameter value in WebSearch requests should
	// improve
	// the relevance of results. This is particularly true for
	// international
	// customers and, even more specifically, for customers in
	// English-speaking
	// countries other than the United States.
	Gl string `json:"gl,omitempty"`

	// GoogleHost: Specifies the Google domain (for example, google.com,
	// google.de, or
	// google.fr) to which the search should be limited.
	GoogleHost string `json:"googleHost,omitempty"`

	// HighRange: Specifies the ending value for a search range. Use
	// `cse:lowRange` and
	// `cse:highrange` to append an inclusive search range
	// of
	// `lowRange...highRange` to the query.
	HighRange string `json:"highRange,omitempty"`

	// Hl: Specifies the interface language (host language) of your user
	// interface.
	// Explicitly setting this parameter improves the performance and
	// the
	// quality of your search results.
	//
	// See the
	// [Interface
	// Languages](https://developers.google.com/custom-search/docs
	// /xml_results#wsInterfaceLanguages)
	// section of [Internationalizing Queries and
	// Results
	// Presentation](https://developers.google.com/custom-search/docs
	// /xml_results#wsInternationalizing)
	// for more information, and [Supported
	// Interface
	// Languages](https://developers.google.com/custom-search/docs/
	// xml_results_appendices#interfaceLanguages)
	// for a list of supported languages.
	Hl string `json:"hl,omitempty"`

	// Hq: Appends the specified query terms to the query, as if they were
	// combined
	// with a logical `AND` operator.
	Hq string `json:"hq,omitempty"`

	// ImgColorType: Restricts results to images of a specified color type.
	// Supported values
	//   are:
	//
	// * `mono` (black and white)
	//
	// * `gray` (grayscale)
	//
	// * `color` (color)
	ImgColorType string `json:"imgColorType,omitempty"`

	// ImgDominantColor: Restricts results to images with a specific
	// dominant color. Supported
	// values are:
	//
	// * `red`
	//
	// * `orange`
	//
	// * `yellow`
	//
	// * `green`
	//
	// * `teal`
	//
	// * `blue`
	//
	// * `purple`
	//
	// * `pink`
	//
	// * `white`
	//
	// * `gray`
	//
	// * `black`
	//
	// * `brown`
	ImgDominantColor string `json:"imgDominantColor,omitempty"`

	// ImgSize: Restricts results to images of a specified size. Supported
	// values are:
	//
	// * `icon` (small)
	//
	// * `small | medium | large | xlarge` (medium)
	//
	// * `xxlarge` (large)
	//
	// * `huge` (extra-large)
	ImgSize string `json:"imgSize,omitempty"`

	// ImgType: Restricts results to images of a specified type. Supported
	// values are:
	//
	// * `clipart` (Clip art)
	//
	// * `face` (Face)
	//
	// * `lineart` (Line drawing)
	//
	// * `photo` (Photo)
	//
	// * `animated` (Animated)
	//
	// * `stock` (Stock)
	ImgType string `json:"imgType,omitempty"`

	// InputEncoding: The character encoding supported for search requests.
	InputEncoding string `json:"inputEncoding,omitempty"`

	// Language: The language of the search results.
	Language string `json:"language,omitempty"`

	// LinkSite: Specifies that all results should contain a link to a
	// specific URL.
	LinkSite string `json:"linkSite,omitempty"`

	// LowRange: Specifies the starting value for a search range. Use
	// `cse:lowRange` and
	// `cse:highrange` to append an inclusive search range
	// of
	// `lowRange...highRange` to the query.
	LowRange string `json:"lowRange,omitempty"`

	// OrTerms: Provides additional search terms to check for in a document,
	// where each
	// document in the search results must contain at least one of
	// the
	// additional search terms. You can also use the
	// [Boolean
	// OR](https://developers.google.com/custom-search/docs/xml_resu
	// lts#BooleanOrqt)
	// query term for this type of query.
	OrTerms string `json:"orTerms,omitempty"`

	// OutputEncoding: The character encoding supported for search results.
	OutputEncoding string `json:"outputEncoding,omitempty"`

	// RelatedSite: Specifies that all search results should be pages that
	// are related to the
	// specified URL. The parameter value should be a URL.
	RelatedSite string `json:"relatedSite,omitempty"`

	// Rights: Filters based on licensing. Supported values include:
	//
	// * `cc_publicdomain`
	//
	// * `cc_attribute`
	//
	// * `cc_sharealike`
	//
	// * `cc_noncommercial`
	//
	// * `cc_nonderived`
	Rights string `json:"rights,omitempty"`

	// Safe: Specifies the
	// [SafeSearch
	// level](https://developers.google.com/custom-search/docs/xm
	// l_results#safeSearchLevels)
	// used for filtering out adult results. This is a custom property
	// not
	// defined in the OpenSearch spec. Valid parameter values are:
	//
	// * "off": Disable SafeSearch
	//
	// * "active": Enable SafeSearch
	Safe string `json:"safe,omitempty"`

	// SearchTerms: The search terms entered by the user.
	SearchTerms string `json:"searchTerms,omitempty"`

	// SearchType: Allowed values are `web` or `image`. If unspecified,
	// results are limited
	// to webpages.
	SearchType string `json:"searchType,omitempty"`

	// SiteSearch: Restricts results to URLs from a specified site.
	SiteSearch string `json:"siteSearch,omitempty"`

	// SiteSearchFilter: Specifies whether to include or exclude results
	// from the site named in
	// the `sitesearch` parameter. Supported values are:
	//
	// * `i`: include content from site
	//
	// * `e`: exclude content from site
	SiteSearchFilter string `json:"siteSearchFilter,omitempty"`

	// Sort: Specifies that results should be sorted according to the
	// specified
	// expression. For example, sort by date.
	Sort string `json:"sort,omitempty"`

	// StartIndex: The index of the current set of search results into the
	// total set of
	// results, where the index of the first result is 1.
	StartIndex int64 `json:"startIndex,omitempty"`

	// StartPage: The page number of this set of results, where the page
	// length is set by
	// the `count` property.
	StartPage int64 `json:"startPage,omitempty"`

	// Title: A description of the query.
	Title string `json:"title,omitempty"`

	// TotalResults: Estimated number of total search results. May not be
	// accurate.
	TotalResults int64 `json:"totalResults,omitempty,string"`

	// ForceSendFields is a list of field names (e.g. "Count") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Count") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *SearchQueriesPreviousPage) MarshalJSON() ([]byte, error) {
	type NoMethod SearchQueriesPreviousPage
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// SearchQueriesRequest: Custom search request metadata.
type SearchQueriesRequest struct {
	// Count: Number of search results returned in this set.
	Count int64 `json:"count,omitempty"`

	// Cr: Restricts search results to documents originating in a
	// particular
	// country. You may use
	// [Boolean
	// operators](https://developers.google.com/custom-search/docs/x
	// ml_results#booleanOperators)
	// in the `cr` parameter's value.
	//
	// Google WebSearch determines the country of a document by analyzing
	// the
	// following:
	//
	// * The top-level domain (TLD) of the document's URL.
	//
	// * The geographic location of the web server's IP address.
	//
	// See [Country (cr)
	// Parameter
	// Values](https://developers.google.com/custom-search/docs/xml
	// _results#countryCollections)
	// for a list of valid values for this parameter.
	Cr string `json:"cr,omitempty"`

	// Cx: The identifier of a custom search engine created using the Custom
	// Search
	// [Control Panel](https://cse.google.com/). This is a custom property
	// not
	// defined in the OpenSearch spec. This parameter is **required**.
	Cx string `json:"cx,omitempty"`

	// DateRestrict: Restricts results to URLs based on date. Supported
	// values include:
	//
	// * `d[number]`: requests results from the specified number of past
	// days.
	//
	// * `w[number]`: requests results from the specified number of past
	// weeks.
	//
	// * `m[number]`: requests results from the specified number of past
	// months.
	//
	// * `y[number]`: requests results from the specified number of past
	// years.
	DateRestrict string `json:"dateRestrict,omitempty"`

	// DisableCnTwTranslation: Enables or disables the [Simplified and
	// Traditional
	// Chinese
	// Search](https://developers.google.com/custom-search/docs/xml_r
	// esults#chineseSearch)
	// feature.
	//
	// Supported values are:
	//
	// * `0`: enabled (default)
	//
	// * `1`: disabled
	DisableCnTwTranslation string `json:"disableCnTwTranslation,omitempty"`

	// ExactTerms: Identifies a phrase that all documents in the search
	// results must
	// contain.
	ExactTerms string `json:"exactTerms,omitempty"`

	// ExcludeTerms: Identifies a word or phrase that should not appear in
	// any documents in
	// the search results.
	ExcludeTerms string `json:"excludeTerms,omitempty"`

	// FileType: Restricts results to files of a specified extension.
	// Filetypes supported
	// by Google include:
	//
	// * Adobe Portable Document Format (`pdf`)
	//
	// * Adobe PostScript (`ps`)
	//
	// * Lotus 1-2-3 (`wk1`, `wk2`, `wk3`, `wk4`, `wk5`, `wki`, `wks`,
	// `wku`)
	//
	// * Lotus WordPro (`lwp`)
	//
	// * Macwrite (`mw`)
	//
	// * Microsoft Excel (`xls`)
	//
	// * Microsoft PowerPoint (`ppt`)
	//
	// * Microsoft Word (`doc`)
	//
	// * Microsoft Works (`wks`, `wps`, `wdb`)
	//
	// * Microsoft Write (`wri`)
	//
	// * Rich Text Format (`rtf`)
	//
	// * Shockwave Flash (`swf`)
	//
	// * Text (`ans`, `txt`).
	//
	// Additional filetypes may be added in the future. An up-to-date list
	// can
	// always be found in Google's [file
	// type
	// FAQ](https://support.google.com/webmasters/answer/35287).
	FileType string `json:"fileType,omitempty"`

	// Filter: Activates or deactivates the automatic filtering of Google
	// search
	// results. See
	// [Automatic
	// Filtering](https://developers.google.com/custom-search/docs
	// /xml_results#automaticFiltering)
	// for more information about Google's search results filters. Valid
	// values
	// for this parameter are:
	//
	// * `0`: Disabled
	//
	// * `1`: Enabled (default)
	//
	// **Note**: By default, Google applies filtering to all search results
	// to
	// improve the quality of those results.
	Filter string `json:"filter,omitempty"`

	// Gl: Boosts search results whose country of origin matches the
	// parameter
	// value. See
	// [Country
	// Codes](https://developers.google.com/custom-search/docs/xml_r
	// esults#countryCodes)
	// for a list of valid values.
	//
	// Specifying a `gl` parameter value in WebSearch requests should
	// improve
	// the relevance of results. This is particularly true for
	// international
	// customers and, even more specifically, for customers in
	// English-speaking
	// countries other than the United States.
	Gl string `json:"gl,omitempty"`

	// GoogleHost: Specifies the Google domain (for example, google.com,
	// google.de, or
	// google.fr) to which the search should be limited.
	GoogleHost string `json:"googleHost,omitempty"`

	// HighRange: Specifies the ending value for a search range. Use
	// `cse:lowRange` and
	// `cse:highrange` to append an inclusive search range
	// of
	// `lowRange...highRange` to the query.
	HighRange string `json:"highRange,omitempty"`

	// Hl: Specifies the interface language (host language) of your user
	// interface.
	// Explicitly setting this parameter improves the performance and
	// the
	// quality of your search results.
	//
	// See the
	// [Interface
	// Languages](https://developers.google.com/custom-search/docs
	// /xml_results#wsInterfaceLanguages)
	// section of [Internationalizing Queries and
	// Results
	// Presentation](https://developers.google.com/custom-search/docs
	// /xml_results#wsInternationalizing)
	// for more information, and [Supported
	// Interface
	// Languages](https://developers.google.com/custom-search/docs/
	// xml_results_appendices#interfaceLanguages)
	// for a list of supported languages.
	Hl string `json:"hl,omitempty"`

	// Hq: Appends the specified query terms to the query, as if they were
	// combined
	// with a logical `AND` operator.
	Hq string `json:"hq,omitempty"`

	// ImgColorType: Restricts results to images of a specified color type.
	// Supported values
	//   are:
	//
	// * `mono` (black and white)
	//
	// * `gray` (grayscale)
	//
	// * `color` (color)
	ImgColorType string `json:"imgColorType,omitempty"`

	// ImgDominantColor: Restricts results to images with a specific
	// dominant color. Supported
	// values are:
	//
	// * `red`
	//
	// * `orange`
	//
	// * `yellow`
	//
	// * `green`
	//
	// * `teal`
	//
	// * `blue`
	//
	// * `purple`
	//
	// * `pink`
	//
	// * `white`
	//
	// * `gray`
	//
	// * `black`
	//
	// * `brown`
	ImgDominantColor string `json:"imgDominantColor,omitempty"`

	// ImgSize: Restricts results to images of a specified size. Supported
	// values are:
	//
	// * `icon` (small)
	//
	// * `small | medium | large | xlarge` (medium)
	//
	// * `xxlarge` (large)
	//
	// * `huge` (extra-large)
	ImgSize string `json:"imgSize,omitempty"`

	// ImgType: Restricts results to images of a specified type. Supported
	// values are:
	//
	// * `clipart` (Clip art)
	//
	// * `face` (Face)
	//
	// * `lineart` (Line drawing)
	//
	// * `photo` (Photo)
	//
	// * `animated` (Animated)
	//
	// * `stock` (Stock)
	ImgType string `json:"imgType,omitempty"`

	// InputEncoding: The character encoding supported for search requests.
	InputEncoding string `json:"inputEncoding,omitempty"`

	// Language: The language of the search results.
	Language string `json:"language,omitempty"`

	// LinkSite: Specifies that all results should contain a link to a
	// specific URL.
	LinkSite string `json:"linkSite,omitempty"`

	// LowRange: Specifies the starting value for a search range. Use
	// `cse:lowRange` and
	// `cse:highrange` to append an inclusive search range
	// of
	// `lowRange...highRange` to the query.
	LowRange string `json:"lowRange,omitempty"`

	// OrTerms: Provides additional search terms to check for in a document,
	// where each
	// document in the search results must contain at least one of
	// the
	// additional search terms. You can also use the
	// [Boolean
	// OR](https://developers.google.com/custom-search/docs/xml_resu
	// lts#BooleanOrqt)
	// query term for this type of query.
	OrTerms string `json:"orTerms,omitempty"`

	// OutputEncoding: The character encoding supported for search results.
	OutputEncoding string `json:"outputEncoding,omitempty"`

	// RelatedSite: Specifies that all search results should be pages that
	// are related to the
	// specified URL. The parameter value should be a URL.
	RelatedSite string `json:"relatedSite,omitempty"`

	// Rights: Filters based on licensing. Supported values include:
	//
	// * `cc_publicdomain`
	//
	// * `cc_attribute`
	//
	// * `cc_sharealike`
	//
	// * `cc_noncommercial`
	//
	// * `cc_nonderived`
	Rights string `json:"rights,omitempty"`

	// Safe: Specifies the
	// [SafeSearch
	// level](https://developers.google.com/custom-search/docs/xm
	// l_results#safeSearchLevels)
	// used for filtering out adult results. This is a custom property
	// not
	// defined in the OpenSearch spec. Valid parameter values are:
	//
	// * "off": Disable SafeSearch
	//
	// * "active": Enable SafeSearch
	Safe string `json:"safe,omitempty"`

	// SearchTerms: The search terms entered by the user.
	SearchTerms string `json:"searchTerms,omitempty"`

	// SearchType: Allowed values are `web` or `image`. If unspecified,
	// results are limited
	// to webpages.
	SearchType string `json:"searchType,omitempty"`

	// SiteSearch: Restricts results to URLs from a specified site.
	SiteSearch string `json:"siteSearch,omitempty"`

	// SiteSearchFilter: Specifies whether to include or exclude results
	// from the site named in
	// the `sitesearch` parameter. Supported values are:
	//
	// * `i`: include content from site
	//
	// * `e`: exclude content from site
	SiteSearchFilter string `json:"siteSearchFilter,omitempty"`

	// Sort: Specifies that results should be sorted according to the
	// specified
	// expression. For example, sort by date.
	Sort string `json:"sort,omitempty"`

	// StartIndex: The index of the current set of search results into the
	// total set of
	// results, where the index of the first result is 1.
	StartIndex int64 `json:"startIndex,omitempty"`

	// StartPage: The page number of this set of results, where the page
	// length is set by
	// the `count` property.
	StartPage int64 `json:"startPage,omitempty"`

	// Title: A description of the query.
	Title string `json:"title,omitempty"`

	// TotalResults: Estimated number of total search results. May not be
	// accurate.
	TotalResults int64 `json:"totalResults,omitempty,string"`

	// ForceSendFields is a list of field names (e.g. "Count") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Count") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *SearchQueriesRequest) MarshalJSON() ([]byte, error) {
	type NoMethod SearchQueriesRequest
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// SearchSearchInformation: Metadata about a search operation.
type SearchSearchInformation struct {
	// FormattedSearchTime: The time taken for the server to return search
	// results, formatted
	// according to locale style.
	FormattedSearchTime string `json:"formattedSearchTime,omitempty"`

	// FormattedTotalResults: The total number of search results, formatted
	// according to locale style.
	FormattedTotalResults string `json:"formattedTotalResults,omitempty"`

	// SearchTime: The time taken for the server to return search results.
	SearchTime float64 `json:"searchTime,omitempty"`

	// TotalResults: The total number of search results returned by the
	// query.
	TotalResults string `json:"totalResults,omitempty"`

	// ForceSendFields is a list of field names (e.g. "FormattedSearchTime")
	// to unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "FormattedSearchTime") to
	// include in API requests with the JSON null value. By default, fields
	// with empty values are omitted from API requests. However, any field
	// with an empty value appearing in NullFields will be sent to the
	// server as null. It is an error if a field in this list has a
	// non-empty value. This may be used to include null fields in Patch
	// requests.
	NullFields []string `json:"-"`
}

func (s *SearchSearchInformation) MarshalJSON() ([]byte, error) {
	type NoMethod SearchSearchInformation
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

func (s *SearchSearchInformation) UnmarshalJSON(data []byte) error {
	type NoMethod SearchSearchInformation
	var s1 struct {
		SearchTime gensupport.JSONFloat64 `json:"searchTime"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.SearchTime = float64(s1.SearchTime)
	return nil
}

// SearchSpelling: Spell correction information for a query.
type SearchSpelling struct {
	// CorrectedQuery: The corrected query.
	CorrectedQuery string `json:"correctedQuery,omitempty"`

	// HtmlCorrectedQuery: The corrected query, formatted in HTML.
	HtmlCorrectedQuery string `json:"htmlCorrectedQuery,omitempty"`

	// ForceSendFields is a list of field names (e.g. "CorrectedQuery") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "CorrectedQuery") to
	// include in API requests with the JSON null value. By default, fields
	// with empty values are omitted from API requests. However, any field
	// with an empty value appearing in NullFields will be sent to the
	// server as null. It is an error if a field in this list has a
	// non-empty value. This may be used to include null fields in Patch
	// requests.
	NullFields []string `json:"-"`
}

func (s *SearchSpelling) MarshalJSON() ([]byte, error) {
	type NoMethod SearchSpelling
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// SearchUrl: OpenSearch template and URL.
type SearchUrl struct {
	// Template: The actual
	// [OpenSearch
	// template](http://www.opensearch.org/specifications/opensea
	// rch/1.1#opensearch_url_template_syntax)
	// for this API.
	Template string `json:"template,omitempty"`

	// Type: The MIME type of the OpenSearch URL template for the Custom
	// Search API.
	Type string `json:"type,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Template") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Template") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *SearchUrl) MarshalJSON() ([]byte, error) {
	type NoMethod SearchUrl
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// method id "search.cse.list":

type CseListCall struct {
	s            *Service
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// List: Returns metadata about the search performed, metadata about the
// custom
// search engine used for the search, and the search results.
func (r *CseService) List() *CseListCall {
	c := &CseListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	return c
}

// C2coff sets the optional parameter "c2coff": Enables or disables
// [Simplified and Traditional
// Chinese
// Search](https://developers.google.com/custom-search/docs/xml_r
// esults#chineseSearch).
//
// The default value for this parameter is 0 (zero), meaning that the
// feature
// is enabled. Supported values are:
//
// * `1`: Disabled
//
// * `0`: Enabled (default)
func (c *CseListCall) C2coff(c2coff string) *CseListCall {
	c.urlParams_.Set("c2coff", c2coff)
	return c
}

// Cr sets the optional parameter "cr": Restricts search results to
// documents originating in a particular country.
// You may use
// [Boolean
// operators](https://developers.google.com/custom-search/docs/x
// ml_results_appendices#booleanOperators)
// in the cr parameter's value.
//
// Google Search determines the country of a document by analyzing:
//
// * the top-level domain (TLD) of the document's URL
//
// * the geographic location of the Web server's IP address
//
// See the [Country
// Parameter
// Values](https://developers.google.com/custom-search/docs/xml
// _results_appendices#countryCollections)
// page for a list of valid values for this parameter.
func (c *CseListCall) Cr(cr string) *CseListCall {
	c.urlParams_.Set("cr", cr)
	return c
}

// Cx sets the optional parameter "cx": The custom search engine ID to
// use for this request.
func (c *CseListCall) Cx(cx string) *CseListCall {
	c.urlParams_.Set("cx", cx)
	return c
}

// DateRestrict sets the optional parameter "dateRestrict": Restricts
// results to URLs based on date. Supported values include:
//
// * `d[number]`: requests results from the specified number of past
// days.
//
// * `w[number]`: requests results from the specified number of past
// weeks.
//
// * `m[number]`: requests results from the specified number of past
// months.
//
// * `y[number]`: requests results from the specified number of past
// years.
func (c *CseListCall) DateRestrict(dateRestrict string) *CseListCall {
	c.urlParams_.Set("dateRestrict", dateRestrict)
	return c
}

// ExactTerms sets the optional parameter "exactTerms": Identifies a
// phrase that all documents in the search results must contain.
func (c *CseListCall) ExactTerms(exactTerms string) *CseListCall {
	c.urlParams_.Set("exactTerms", exactTerms)
	return c
}

// ExcludeTerms sets the optional parameter "excludeTerms": Identifies a
// word or phrase that should not appear in any documents in the
// search results.
func (c *CseListCall) ExcludeTerms(excludeTerms string) *CseListCall {
	c.urlParams_.Set("excludeTerms", excludeTerms)
	return c
}

// FileType sets the optional parameter "fileType": Restricts results to
// files of a specified extension. A list of file types
// indexable by Google can be found in Search Console
// [Help
// Center](https://support.google.com/webmasters/answer/35287).
func (c *CseListCall) FileType(fileType string) *CseListCall {
	c.urlParams_.Set("fileType", fileType)
	return c
}

// Filter sets the optional parameter "filter": Controls turning on or
// off the duplicate content filter.
//
// * See
// [Automatic
// Filtering](https://developers.google.com/custom-search/docs
// /xml_results#automaticFiltering)
// for more information about Google's search results filters. Note that
// host
// crowding filtering applies only to multi-site searches.
//
// * By default, Google applies filtering to all search results to
// improve the
// quality of those results.
//
// Acceptable values are:
//
// * `0`: Turns off duplicate content filter.
//
// * `1`: Turns on duplicate content filter.
func (c *CseListCall) Filter(filter string) *CseListCall {
	c.urlParams_.Set("filter", filter)
	return c
}

// Gl sets the optional parameter "gl": Geolocation of end user.
//
// * The `gl` parameter value is a two-letter country code. The `gl`
// parameter
// boosts search results whose country of origin matches the parameter
// value.
// See the
// [Country
// Codes](https://developers.google.com/custom-search/docs/xml_r
// esults_appendices#countryCodes)
// page for a list of valid values.
//
// * Specifying a `gl` parameter value should lead to more relevant
// results.
// This is particularly true for international customers and, even
// more
// specifically, for customers in English- speaking countries other than
// the
// United States.
func (c *CseListCall) Gl(gl string) *CseListCall {
	c.urlParams_.Set("gl", gl)
	return c
}

// Googlehost sets the optional parameter "googlehost": **Deprecated**.
// Use the `gl` parameter for a similar effect.
//
// The local Google domain (for example, google.com, google.de,
// or
// google.fr) to use to perform the search.
func (c *CseListCall) Googlehost(googlehost string) *CseListCall {
	c.urlParams_.Set("googlehost", googlehost)
	return c
}

// HighRange sets the optional parameter "highRange": Specifies the
// ending value for a search range.
//
// * Use `lowRange` and `highRange` to append an inclusive search range
// of
// `lowRange...highRange` to the query.
func (c *CseListCall) HighRange(highRange string) *CseListCall {
	c.urlParams_.Set("highRange", highRange)
	return c
}

// Hl sets the optional parameter "hl": Sets the user interface
// language.
//
// * Explicitly setting this parameter improves the performance and
// the
// quality of your search results.
//
// * See the
// [Interface
// Languages](https://developers.google.com/custom-search/docs
// /xml_results#wsInterfaceLanguages)
// section of [Internationalizing Queries and
// Results
// Presentation](https://developers.google.com/custom-search/docs
// /xml_results#wsInternationalizing)
// for more information, and (Supported
// Interface
// Languages)[https://developers.google.com/custom-search/docs/
// xml_results_appendices#interfaceLanguages]
// for a list of supported languages.
func (c *CseListCall) Hl(hl string) *CseListCall {
	c.urlParams_.Set("hl", hl)
	return c
}

// Hq sets the optional parameter "hq": Appends the specified query
// terms to the query, as if they were combined
// with a logical AND operator.
func (c *CseListCall) Hq(hq string) *CseListCall {
	c.urlParams_.Set("hq", hq)
	return c
}

// ImgColorType sets the optional parameter "imgColorType": Returns
// black and white, grayscale, transparent, or color images.
// Acceptable values are:
//
// * "color"
//
// * "gray"
//
// * "mono": black and white
//
// * "trans": transparent background
//
// Possible values:
//   "imgColorTypeUndefined"
//   "mono"
//   "gray"
//   "color"
//   "trans"
func (c *CseListCall) ImgColorType(imgColorType string) *CseListCall {
	c.urlParams_.Set("imgColorType", imgColorType)
	return c
}

// ImgDominantColor sets the optional parameter "imgDominantColor":
// Returns images of a specific dominant color. Acceptable values
// are:
//
// * "black"
//
// * "blue"
//
// * "brown"
//
// * "gray"
//
// * "green"
//
// * "orange"
//
// * "pink"
//
// * "purple"
//
// * "red"
//
// * "teal"
//
// * "white"
//
// * "yellow"
//
// Possible values:
//   "imgDominantColorUndefined"
//   "black"
//   "blue"
//   "brown"
//   "gray"
//   "green"
//   "orange"
//   "pink"
//   "purple"
//   "red"
//   "teal"
//   "white"
//   "yellow"
func (c *CseListCall) ImgDominantColor(imgDominantColor string) *CseListCall {
	c.urlParams_.Set("imgDominantColor", imgDominantColor)
	return c
}

// ImgSize sets the optional parameter "imgSize": Returns images of a
// specified size. Acceptable values are:
//
// * "huge"
//
// * "icon"
//
// * "large"
//
// * "medium"
//
// * "small"
//
// * "xlarge"
//
// * "xxlarge"
//
// Possible values:
//   "imgSizeUndefined"
//   "HUGE"
//   "ICON"
//   "LARGE"
//   "MEDIUM"
//   "SMALL"
//   "XLARGE"
//   "XXLARGE"
func (c *CseListCall) ImgSize(imgSize string) *CseListCall {
	c.urlParams_.Set("imgSize", imgSize)
	return c
}

// ImgType sets the optional parameter "imgType": Returns images of a
// type. Acceptable values are:
//
// * "clipart"
//
// * "face"
//
// * "lineart"
//
// * "stock"
//
// * "photo"
//
// * "animated"
//
// Possible values:
//   "imgTypeUndefined"
//   "clipart"
//   "face"
//   "lineart"
//   "stock"
//   "photo"
//   "animated"
func (c *CseListCall) ImgType(imgType string) *CseListCall {
	c.urlParams_.Set("imgType", imgType)
	return c
}

// LinkSite sets the optional parameter "linkSite": Specifies that all
// search results should contain a link to a particular
// URL.
func (c *CseListCall) LinkSite(linkSite string) *CseListCall {
	c.urlParams_.Set("linkSite", linkSite)
	return c
}

// LowRange sets the optional parameter "lowRange": Specifies the
// starting value for a search range. Use `lowRange` and
// `highRange` to append an inclusive search range of
// `lowRange...highRange`
// to the query.
func (c *CseListCall) LowRange(lowRange string) *CseListCall {
	c.urlParams_.Set("lowRange", lowRange)
	return c
}

// Lr sets the optional parameter "lr": Restricts the search to
// documents written in a particular language
// (e.g.,
// `lr=lang_ja`).
//
// Acceptable values are:
//
// * "lang_ar": Arabic
//
// * "lang_bg": Bulgarian
//
// * "lang_ca": Catalan
//
// * "lang_cs": Czech
//
// * "lang_da": Danish
//
// * "lang_de": German
//
// * "lang_el": Greek
//
// * "lang_en": English
//
// * "lang_es": Spanish
//
// * "lang_et": Estonian
//
// * "lang_fi": Finnish
//
// * "lang_fr": French
//
// * "lang_hr": Croatian
//
// * "lang_hu": Hungarian
//
// * "lang_id": Indonesian
//
// * "lang_is": Icelandic
//
// * "lang_it": Italian
//
// * "lang_iw": Hebrew
//
// * "lang_ja": Japanese
//
// * "lang_ko": Korean
//
// * "lang_lt": Lithuanian
//
// * "lang_lv": Latvian
//
// * "lang_nl": Dutch
//
// * "lang_no": Norwegian
//
// * "lang_pl": Polish
//
// * "lang_pt": Portuguese
//
// * "lang_ro": Romanian
//
// * "lang_ru": Russian
//
// * "lang_sk": Slovak
//
// * "lang_sl": Slovenian
//
// * "lang_sr": Serbian
//
// * "lang_sv": Swedish
//
// * "lang_tr": Turkish
//
// * "lang_zh-CN": Chinese (Simplified)
//
// * "lang_zh-TW": Chinese (Traditional)
func (c *CseListCall) Lr(lr string) *CseListCall {
	c.urlParams_.Set("lr", lr)
	return c
}

// Num sets the optional parameter "num": Number of search results to
// return.
//
// * Valid values are integers between 1 and 10, inclusive.
func (c *CseListCall) Num(num int64) *CseListCall {
	c.urlParams_.Set("num", fmt.Sprint(num))
	return c
}

// OrTerms sets the optional parameter "orTerms": Provides additional
// search terms to check for in a document, where each
// document in the search results must contain at least one of the
// additional
// search terms.
func (c *CseListCall) OrTerms(orTerms string) *CseListCall {
	c.urlParams_.Set("orTerms", orTerms)
	return c
}

// Q sets the optional parameter "q": Query
func (c *CseListCall) Q(q string) *CseListCall {
	c.urlParams_.Set("q", q)
	return c
}

// RelatedSite sets the optional parameter "relatedSite": Specifies that
// all search results should be pages that are related to the
// specified URL.
func (c *CseListCall) RelatedSite(relatedSite string) *CseListCall {
	c.urlParams_.Set("relatedSite", relatedSite)
	return c
}

// Rights sets the optional parameter "rights": Filters based on
// licensing. Supported values include:
// `cc_publicdomain`,
// `cc_attribute`, `cc_sharealike`, `cc_noncommercial`, `cc_nonderived`
// and
// combinations of these. See
// [typical
// combinations](https://wiki.creativecommons.org/wiki/CC_Search
// _integration).
func (c *CseListCall) Rights(rights string) *CseListCall {
	c.urlParams_.Set("rights", rights)
	return c
}

// Safe sets the optional parameter "safe": Search safety level.
// Acceptable values are:
//
// * "active": Enables SafeSearch filtering.
//
// * "off": Disables SafeSearch filtering. (default)
//
// Possible values:
//   "safeUndefined"
//   "active"
//   "high"
//   "medium"
//   "off"
func (c *CseListCall) Safe(safe string) *CseListCall {
	c.urlParams_.Set("safe", safe)
	return c
}

// SearchType sets the optional parameter "searchType": Specifies the
// search type: `image`. If unspecified, results are limited
// to
// webpages.
//
// Acceptable values are:
//
// * "image": custom image search.
//
// Possible values:
//   "searchTypeUndefined"
//   "image"
func (c *CseListCall) SearchType(searchType string) *CseListCall {
	c.urlParams_.Set("searchType", searchType)
	return c
}

// SiteSearch sets the optional parameter "siteSearch": Specifies a
// given site which should always be included or excluded from
// results (see `siteSearchFilter` parameter, below).
func (c *CseListCall) SiteSearch(siteSearch string) *CseListCall {
	c.urlParams_.Set("siteSearch", siteSearch)
	return c
}

// SiteSearchFilter sets the optional parameter "siteSearchFilter":
// Controls whether to include or exclude results from the site named in
// the
// `siteSearch` parameter.
//
// Acceptable values are:
//
// * "e": exclude
//
// * "i": include
//
// Possible values:
//   "siteSearchFilterUndefined"
//   "e"
//   "i"
func (c *CseListCall) SiteSearchFilter(siteSearchFilter string) *CseListCall {
	c.urlParams_.Set("siteSearchFilter", siteSearchFilter)
	return c
}

// Sort sets the optional parameter "sort": The sort expression to apply
// to the results.
func (c *CseListCall) Sort(sort string) *CseListCall {
	c.urlParams_.Set("sort", sort)
	return c
}

// Start sets the optional parameter "start": The index of the first
// result to return. The default number of results per
// page is 10, so `&start=11` would start at the top of the second page
// of
// results. **Note**: The JSON API will never return more than 100
// results,
// even if more than 100 documents match the query, so setting the sum
// of
// `start + num` to a number greater than 100 will produce an error.
// Also note
// that the maximum value for `num` is 10.
func (c *CseListCall) Start(start int64) *CseListCall {
	c.urlParams_.Set("start", fmt.Sprint(start))
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *CseListCall) Fields(s ...googleapi.Field) *CseListCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets the optional parameter which makes the operation
// fail if the object's ETag matches the given value. This is useful for
// getting updates only after the object has changed since the last
// request. Use googleapi.IsNotModified to check whether the response
// error from Do is the result of In-None-Match.
func (c *CseListCall) IfNoneMatch(entityTag string) *CseListCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *CseListCall) Context(ctx context.Context) *CseListCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *CseListCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *CseListCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200617")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "customsearch/v1")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "search.cse.list" call.
// Exactly one of *Search or error will be non-nil. Any non-2xx status
// code is an error. Response headers are in either
// *Search.ServerResponse.Header or (if a response was returned at all)
// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
// check whether the returned error was because http.StatusNotModified
// was returned.
func (c *CseListCall) Do(opts ...googleapi.CallOption) (*Search, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &Search{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Returns metadata about the search performed, metadata about the custom\nsearch engine used for the search, and the search results.",
	//   "flatPath": "customsearch/v1",
	//   "httpMethod": "GET",
	//   "id": "search.cse.list",
	//   "parameterOrder": [],
	//   "parameters": {
	//     "c2coff": {
	//       "description": "Enables or disables [Simplified and Traditional Chinese\nSearch](https://developers.google.com/custom-search/docs/xml_results#chineseSearch).\n\nThe default value for this parameter is 0 (zero), meaning that the feature\nis enabled. Supported values are:\n\n* `1`: Disabled\n\n* `0`: Enabled (default)",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "cr": {
	//       "description": "Restricts search results to documents originating in a particular country.\nYou may use [Boolean\noperators](https://developers.google.com/custom-search/docs/xml_results_appendices#booleanOperators)\nin the cr parameter's value.\n\nGoogle Search determines the country of a document by analyzing:\n\n* the top-level domain (TLD) of the document's URL\n\n* the geographic location of the Web server's IP address\n\nSee the [Country Parameter\nValues](https://developers.google.com/custom-search/docs/xml_results_appendices#countryCollections)\npage for a list of valid values for this parameter.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "cx": {
	//       "description": "The custom search engine ID to use for this request.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "dateRestrict": {
	//       "description": "Restricts results to URLs based on date. Supported values include:\n\n* `d[number]`: requests results from the specified number of past days.\n\n* `w[number]`: requests results from the specified number of past weeks.\n\n* `m[number]`: requests results from the specified number of past months.\n\n* `y[number]`: requests results from the specified number of past years.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "exactTerms": {
	//       "description": "Identifies a phrase that all documents in the search results must contain.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "excludeTerms": {
	//       "description": "Identifies a word or phrase that should not appear in any documents in the\nsearch results.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "fileType": {
	//       "description": "Restricts results to files of a specified extension. A list of file types\nindexable by Google can be found in Search Console [Help\nCenter](https://support.google.com/webmasters/answer/35287).",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "filter": {
	//       "description": "Controls turning on or off the duplicate content filter.\n\n* See [Automatic\nFiltering](https://developers.google.com/custom-search/docs/xml_results#automaticFiltering)\nfor more information about Google's search results filters. Note that host\ncrowding filtering applies only to multi-site searches.\n\n* By default, Google applies filtering to all search results to improve the\nquality of those results.\n\nAcceptable values are:\n\n* `0`: Turns off duplicate content filter.\n\n* `1`: Turns on duplicate content filter.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "gl": {
	//       "description": "Geolocation of end user.\n\n* The `gl` parameter value is a two-letter country code. The `gl` parameter\nboosts search results whose country of origin matches the parameter value.\nSee the [Country\nCodes](https://developers.google.com/custom-search/docs/xml_results_appendices#countryCodes)\npage for a list of valid values.\n\n* Specifying a `gl` parameter value should lead to more relevant results.\nThis is particularly true for international customers and, even more\nspecifically, for customers in English- speaking countries other than the\nUnited States.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "googlehost": {
	//       "description": "**Deprecated**. Use the `gl` parameter for a similar effect.\n\nThe local Google domain (for example, google.com, google.de, or\ngoogle.fr) to use to perform the search.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "highRange": {
	//       "description": "Specifies the ending value for a search range.\n\n* Use `lowRange` and `highRange` to append an inclusive search range of\n`lowRange...highRange` to the query.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "hl": {
	//       "description": "Sets the user interface language.\n\n* Explicitly setting this parameter improves the performance and the\nquality of your search results.\n\n* See the [Interface\nLanguages](https://developers.google.com/custom-search/docs/xml_results#wsInterfaceLanguages)\nsection of [Internationalizing Queries and Results\nPresentation](https://developers.google.com/custom-search/docs/xml_results#wsInternationalizing)\nfor more information, and (Supported Interface\nLanguages)[https://developers.google.com/custom-search/docs/xml_results_appendices#interfaceLanguages]\nfor a list of supported languages.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "hq": {
	//       "description": "Appends the specified query terms to the query, as if they were combined\nwith a logical AND operator.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgColorType": {
	//       "description": "Returns black and white, grayscale, transparent, or color images.\nAcceptable values are:\n\n* `\"color\"`\n\n* `\"gray\"`\n\n* `\"mono\"`: black and white\n\n* `\"trans\"`: transparent background",
	//       "enum": [
	//         "imgColorTypeUndefined",
	//         "mono",
	//         "gray",
	//         "color",
	//         "trans"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgDominantColor": {
	//       "description": "Returns images of a specific dominant color. Acceptable values are:\n\n* `\"black\"`\n\n* `\"blue\"`\n\n* `\"brown\"`\n\n* `\"gray\"`\n\n* `\"green\"`\n\n* `\"orange\"`\n\n* `\"pink\"`\n\n* `\"purple\"`\n\n* `\"red\"`\n\n* `\"teal\"`\n\n* `\"white\"`\n\n* `\"yellow\"`",
	//       "enum": [
	//         "imgDominantColorUndefined",
	//         "black",
	//         "blue",
	//         "brown",
	//         "gray",
	//         "green",
	//         "orange",
	//         "pink",
	//         "purple",
	//         "red",
	//         "teal",
	//         "white",
	//         "yellow"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgSize": {
	//       "description": "Returns images of a specified size. Acceptable values are:\n\n* `\"huge\"`\n\n* `\"icon\"`\n\n* `\"large\"`\n\n* `\"medium\"`\n\n* `\"small\"`\n\n* `\"xlarge\"`\n\n* `\"xxlarge\"`",
	//       "enum": [
	//         "imgSizeUndefined",
	//         "HUGE",
	//         "ICON",
	//         "LARGE",
	//         "MEDIUM",
	//         "SMALL",
	//         "XLARGE",
	//         "XXLARGE"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgType": {
	//       "description": "Returns images of a type. Acceptable values are:\n\n* `\"clipart\"`\n\n* `\"face\"`\n\n* `\"lineart\"`\n\n* `\"stock\"`\n\n* `\"photo\"`\n\n* `\"animated\"`",
	//       "enum": [
	//         "imgTypeUndefined",
	//         "clipart",
	//         "face",
	//         "lineart",
	//         "stock",
	//         "photo",
	//         "animated"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "linkSite": {
	//       "description": "Specifies that all search results should contain a link to a particular\nURL.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "lowRange": {
	//       "description": "Specifies the starting value for a search range. Use `lowRange` and\n`highRange` to append an inclusive search range of `lowRange...highRange`\nto the query.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "lr": {
	//       "description": "Restricts the search to documents written in a particular language (e.g.,\n`lr=lang_ja`).\n\nAcceptable values are:\n\n* `\"lang_ar\"`: Arabic\n\n* `\"lang_bg\"`: Bulgarian\n\n* `\"lang_ca\"`: Catalan\n\n* `\"lang_cs\"`: Czech\n\n* `\"lang_da\"`: Danish\n\n* `\"lang_de\"`: German\n\n* `\"lang_el\"`: Greek\n\n* `\"lang_en\"`: English\n\n* `\"lang_es\"`: Spanish\n\n* `\"lang_et\"`: Estonian\n\n* `\"lang_fi\"`: Finnish\n\n* `\"lang_fr\"`: French\n\n* `\"lang_hr\"`: Croatian\n\n* `\"lang_hu\"`: Hungarian\n\n* `\"lang_id\"`: Indonesian\n\n* `\"lang_is\"`: Icelandic\n\n* `\"lang_it\"`: Italian\n\n* `\"lang_iw\"`: Hebrew\n\n* `\"lang_ja\"`: Japanese\n\n* `\"lang_ko\"`: Korean\n\n* `\"lang_lt\"`: Lithuanian\n\n* `\"lang_lv\"`: Latvian\n\n* `\"lang_nl\"`: Dutch\n\n* `\"lang_no\"`: Norwegian\n\n* `\"lang_pl\"`: Polish\n\n* `\"lang_pt\"`: Portuguese\n\n* `\"lang_ro\"`: Romanian\n\n* `\"lang_ru\"`: Russian\n\n* `\"lang_sk\"`: Slovak\n\n* `\"lang_sl\"`: Slovenian\n\n* `\"lang_sr\"`: Serbian\n\n* `\"lang_sv\"`: Swedish\n\n* `\"lang_tr\"`: Turkish\n\n* `\"lang_zh-CN\"`: Chinese (Simplified)\n\n* `\"lang_zh-TW\"`: Chinese (Traditional)",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "num": {
	//       "description": "Number of search results to return.\n\n* Valid values are integers between 1 and 10, inclusive.",
	//       "format": "int32",
	//       "location": "query",
	//       "type": "integer"
	//     },
	//     "orTerms": {
	//       "description": "Provides additional search terms to check for in a document, where each\ndocument in the search results must contain at least one of the additional\nsearch terms.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "q": {
	//       "description": "Query",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "relatedSite": {
	//       "description": "Specifies that all search results should be pages that are related to the\nspecified URL.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "rights": {
	//       "description": "Filters based on licensing. Supported values include: `cc_publicdomain`,\n`cc_attribute`, `cc_sharealike`, `cc_noncommercial`, `cc_nonderived` and\ncombinations of these. See [typical\ncombinations](https://wiki.creativecommons.org/wiki/CC_Search_integration).",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "safe": {
	//       "description": "Search safety level. Acceptable values are:\n\n* `\"active\"`: Enables SafeSearch filtering.\n\n* `\"off\"`: Disables SafeSearch filtering. (default)",
	//       "enum": [
	//         "safeUndefined",
	//         "active",
	//         "high",
	//         "medium",
	//         "off"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "searchType": {
	//       "description": "Specifies the search type: `image`. If unspecified, results are limited to\nwebpages.\n\nAcceptable values are:\n\n* `\"image\"`: custom image search.",
	//       "enum": [
	//         "searchTypeUndefined",
	//         "image"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "siteSearch": {
	//       "description": "Specifies a given site which should always be included or excluded from\nresults (see `siteSearchFilter` parameter, below).",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "siteSearchFilter": {
	//       "description": "Controls whether to include or exclude results from the site named in the\n`siteSearch` parameter.\n\nAcceptable values are:\n\n* `\"e\"`: exclude\n\n* `\"i\"`: include",
	//       "enum": [
	//         "siteSearchFilterUndefined",
	//         "e",
	//         "i"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "sort": {
	//       "description": "The sort expression to apply to the results.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "start": {
	//       "description": "The index of the first result to return. The default number of results per\npage is 10, so `\u0026start=11` would start at the top of the second page of\nresults. **Note**: The JSON API will never return more than 100 results,\neven if more than 100 documents match the query, so setting the sum of\n`start + num` to a number greater than 100 will produce an error. Also note\nthat the maximum value for `num` is 10.",
	//       "format": "uint32",
	//       "location": "query",
	//       "type": "integer"
	//     }
	//   },
	//   "path": "customsearch/v1",
	//   "response": {
	//     "$ref": "Search"
	//   }
	// }

}

// method id "search.cse.siterestrict.list":

type CseSiterestrictListCall struct {
	s            *Service
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// List: Returns metadata about the search performed, metadata about the
// custom
// search engine used for the search, and the search results. Uses a
// small set
// of url patterns.
func (r *CseSiterestrictService) List() *CseSiterestrictListCall {
	c := &CseSiterestrictListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	return c
}

// C2coff sets the optional parameter "c2coff": Enables or disables
// [Simplified and Traditional
// Chinese
// Search](https://developers.google.com/custom-search/docs/xml_r
// esults#chineseSearch).
//
// The default value for this parameter is 0 (zero), meaning that the
// feature
// is enabled. Supported values are:
//
// * `1`: Disabled
//
// * `0`: Enabled (default)
func (c *CseSiterestrictListCall) C2coff(c2coff string) *CseSiterestrictListCall {
	c.urlParams_.Set("c2coff", c2coff)
	return c
}

// Cr sets the optional parameter "cr": Restricts search results to
// documents originating in a particular country.
// You may use
// [Boolean
// operators](https://developers.google.com/custom-search/docs/x
// ml_results_appendices#booleanOperators)
// in the cr parameter's value.
//
// Google Search determines the country of a document by analyzing:
//
// * the top-level domain (TLD) of the document's URL
//
// * the geographic location of the Web server's IP address
//
// See the [Country
// Parameter
// Values](https://developers.google.com/custom-search/docs/xml
// _results_appendices#countryCollections)
// page for a list of valid values for this parameter.
func (c *CseSiterestrictListCall) Cr(cr string) *CseSiterestrictListCall {
	c.urlParams_.Set("cr", cr)
	return c
}

// Cx sets the optional parameter "cx": The custom search engine ID to
// use for this request.
func (c *CseSiterestrictListCall) Cx(cx string) *CseSiterestrictListCall {
	c.urlParams_.Set("cx", cx)
	return c
}

// DateRestrict sets the optional parameter "dateRestrict": Restricts
// results to URLs based on date. Supported values include:
//
// * `d[number]`: requests results from the specified number of past
// days.
//
// * `w[number]`: requests results from the specified number of past
// weeks.
//
// * `m[number]`: requests results from the specified number of past
// months.
//
// * `y[number]`: requests results from the specified number of past
// years.
func (c *CseSiterestrictListCall) DateRestrict(dateRestrict string) *CseSiterestrictListCall {
	c.urlParams_.Set("dateRestrict", dateRestrict)
	return c
}

// ExactTerms sets the optional parameter "exactTerms": Identifies a
// phrase that all documents in the search results must contain.
func (c *CseSiterestrictListCall) ExactTerms(exactTerms string) *CseSiterestrictListCall {
	c.urlParams_.Set("exactTerms", exactTerms)
	return c
}

// ExcludeTerms sets the optional parameter "excludeTerms": Identifies a
// word or phrase that should not appear in any documents in the
// search results.
func (c *CseSiterestrictListCall) ExcludeTerms(excludeTerms string) *CseSiterestrictListCall {
	c.urlParams_.Set("excludeTerms", excludeTerms)
	return c
}

// FileType sets the optional parameter "fileType": Restricts results to
// files of a specified extension. A list of file types
// indexable by Google can be found in Search Console
// [Help
// Center](https://support.google.com/webmasters/answer/35287).
func (c *CseSiterestrictListCall) FileType(fileType string) *CseSiterestrictListCall {
	c.urlParams_.Set("fileType", fileType)
	return c
}

// Filter sets the optional parameter "filter": Controls turning on or
// off the duplicate content filter.
//
// * See
// [Automatic
// Filtering](https://developers.google.com/custom-search/docs
// /xml_results#automaticFiltering)
// for more information about Google's search results filters. Note that
// host
// crowding filtering applies only to multi-site searches.
//
// * By default, Google applies filtering to all search results to
// improve the
// quality of those results.
//
// Acceptable values are:
//
// * `0`: Turns off duplicate content filter.
//
// * `1`: Turns on duplicate content filter.
func (c *CseSiterestrictListCall) Filter(filter string) *CseSiterestrictListCall {
	c.urlParams_.Set("filter", filter)
	return c
}

// Gl sets the optional parameter "gl": Geolocation of end user.
//
// * The `gl` parameter value is a two-letter country code. The `gl`
// parameter
// boosts search results whose country of origin matches the parameter
// value.
// See the
// [Country
// Codes](https://developers.google.com/custom-search/docs/xml_r
// esults_appendices#countryCodes)
// page for a list of valid values.
//
// * Specifying a `gl` parameter value should lead to more relevant
// results.
// This is particularly true for international customers and, even
// more
// specifically, for customers in English- speaking countries other than
// the
// United States.
func (c *CseSiterestrictListCall) Gl(gl string) *CseSiterestrictListCall {
	c.urlParams_.Set("gl", gl)
	return c
}

// Googlehost sets the optional parameter "googlehost": **Deprecated**.
// Use the `gl` parameter for a similar effect.
//
// The local Google domain (for example, google.com, google.de,
// or
// google.fr) to use to perform the search.
func (c *CseSiterestrictListCall) Googlehost(googlehost string) *CseSiterestrictListCall {
	c.urlParams_.Set("googlehost", googlehost)
	return c
}

// HighRange sets the optional parameter "highRange": Specifies the
// ending value for a search range.
//
// * Use `lowRange` and `highRange` to append an inclusive search range
// of
// `lowRange...highRange` to the query.
func (c *CseSiterestrictListCall) HighRange(highRange string) *CseSiterestrictListCall {
	c.urlParams_.Set("highRange", highRange)
	return c
}

// Hl sets the optional parameter "hl": Sets the user interface
// language.
//
// * Explicitly setting this parameter improves the performance and
// the
// quality of your search results.
//
// * See the
// [Interface
// Languages](https://developers.google.com/custom-search/docs
// /xml_results#wsInterfaceLanguages)
// section of [Internationalizing Queries and
// Results
// Presentation](https://developers.google.com/custom-search/docs
// /xml_results#wsInternationalizing)
// for more information, and (Supported
// Interface
// Languages)[https://developers.google.com/custom-search/docs/
// xml_results_appendices#interfaceLanguages]
// for a list of supported languages.
func (c *CseSiterestrictListCall) Hl(hl string) *CseSiterestrictListCall {
	c.urlParams_.Set("hl", hl)
	return c
}

// Hq sets the optional parameter "hq": Appends the specified query
// terms to the query, as if they were combined
// with a logical AND operator.
func (c *CseSiterestrictListCall) Hq(hq string) *CseSiterestrictListCall {
	c.urlParams_.Set("hq", hq)
	return c
}

// ImgColorType sets the optional parameter "imgColorType": Returns
// black and white, grayscale, transparent, or color images.
// Acceptable values are:
//
// * "color"
//
// * "gray"
//
// * "mono": black and white
//
// * "trans": transparent background
//
// Possible values:
//   "imgColorTypeUndefined"
//   "mono"
//   "gray"
//   "color"
//   "trans"
func (c *CseSiterestrictListCall) ImgColorType(imgColorType string) *CseSiterestrictListCall {
	c.urlParams_.Set("imgColorType", imgColorType)
	return c
}

// ImgDominantColor sets the optional parameter "imgDominantColor":
// Returns images of a specific dominant color. Acceptable values
// are:
//
// * "black"
//
// * "blue"
//
// * "brown"
//
// * "gray"
//
// * "green"
//
// * "orange"
//
// * "pink"
//
// * "purple"
//
// * "red"
//
// * "teal"
//
// * "white"
//
// * "yellow"
//
// Possible values:
//   "imgDominantColorUndefined"
//   "black"
//   "blue"
//   "brown"
//   "gray"
//   "green"
//   "orange"
//   "pink"
//   "purple"
//   "red"
//   "teal"
//   "white"
//   "yellow"
func (c *CseSiterestrictListCall) ImgDominantColor(imgDominantColor string) *CseSiterestrictListCall {
	c.urlParams_.Set("imgDominantColor", imgDominantColor)
	return c
}

// ImgSize sets the optional parameter "imgSize": Returns images of a
// specified size. Acceptable values are:
//
// * "huge"
//
// * "icon"
//
// * "large"
//
// * "medium"
//
// * "small"
//
// * "xlarge"
//
// * "xxlarge"
//
// Possible values:
//   "imgSizeUndefined"
//   "HUGE"
//   "ICON"
//   "LARGE"
//   "MEDIUM"
//   "SMALL"
//   "XLARGE"
//   "XXLARGE"
func (c *CseSiterestrictListCall) ImgSize(imgSize string) *CseSiterestrictListCall {
	c.urlParams_.Set("imgSize", imgSize)
	return c
}

// ImgType sets the optional parameter "imgType": Returns images of a
// type. Acceptable values are:
//
// * "clipart"
//
// * "face"
//
// * "lineart"
//
// * "stock"
//
// * "photo"
//
// * "animated"
//
// Possible values:
//   "imgTypeUndefined"
//   "clipart"
//   "face"
//   "lineart"
//   "stock"
//   "photo"
//   "animated"
func (c *CseSiterestrictListCall) ImgType(imgType string) *CseSiterestrictListCall {
	c.urlParams_.Set("imgType", imgType)
	return c
}

// LinkSite sets the optional parameter "linkSite": Specifies that all
// search results should contain a link to a particular
// URL.
func (c *CseSiterestrictListCall) LinkSite(linkSite string) *CseSiterestrictListCall {
	c.urlParams_.Set("linkSite", linkSite)
	return c
}

// LowRange sets the optional parameter "lowRange": Specifies the
// starting value for a search range. Use `lowRange` and
// `highRange` to append an inclusive search range of
// `lowRange...highRange`
// to the query.
func (c *CseSiterestrictListCall) LowRange(lowRange string) *CseSiterestrictListCall {
	c.urlParams_.Set("lowRange", lowRange)
	return c
}

// Lr sets the optional parameter "lr": Restricts the search to
// documents written in a particular language
// (e.g.,
// `lr=lang_ja`).
//
// Acceptable values are:
//
// * "lang_ar": Arabic
//
// * "lang_bg": Bulgarian
//
// * "lang_ca": Catalan
//
// * "lang_cs": Czech
//
// * "lang_da": Danish
//
// * "lang_de": German
//
// * "lang_el": Greek
//
// * "lang_en": English
//
// * "lang_es": Spanish
//
// * "lang_et": Estonian
//
// * "lang_fi": Finnish
//
// * "lang_fr": French
//
// * "lang_hr": Croatian
//
// * "lang_hu": Hungarian
//
// * "lang_id": Indonesian
//
// * "lang_is": Icelandic
//
// * "lang_it": Italian
//
// * "lang_iw": Hebrew
//
// * "lang_ja": Japanese
//
// * "lang_ko": Korean
//
// * "lang_lt": Lithuanian
//
// * "lang_lv": Latvian
//
// * "lang_nl": Dutch
//
// * "lang_no": Norwegian
//
// * "lang_pl": Polish
//
// * "lang_pt": Portuguese
//
// * "lang_ro": Romanian
//
// * "lang_ru": Russian
//
// * "lang_sk": Slovak
//
// * "lang_sl": Slovenian
//
// * "lang_sr": Serbian
//
// * "lang_sv": Swedish
//
// * "lang_tr": Turkish
//
// * "lang_zh-CN": Chinese (Simplified)
//
// * "lang_zh-TW": Chinese (Traditional)
func (c *CseSiterestrictListCall) Lr(lr string) *CseSiterestrictListCall {
	c.urlParams_.Set("lr", lr)
	return c
}

// Num sets the optional parameter "num": Number of search results to
// return.
//
// * Valid values are integers between 1 and 10, inclusive.
func (c *CseSiterestrictListCall) Num(num int64) *CseSiterestrictListCall {
	c.urlParams_.Set("num", fmt.Sprint(num))
	return c
}

// OrTerms sets the optional parameter "orTerms": Provides additional
// search terms to check for in a document, where each
// document in the search results must contain at least one of the
// additional
// search terms.
func (c *CseSiterestrictListCall) OrTerms(orTerms string) *CseSiterestrictListCall {
	c.urlParams_.Set("orTerms", orTerms)
	return c
}

// Q sets the optional parameter "q": Query
func (c *CseSiterestrictListCall) Q(q string) *CseSiterestrictListCall {
	c.urlParams_.Set("q", q)
	return c
}

// RelatedSite sets the optional parameter "relatedSite": Specifies that
// all search results should be pages that are related to the
// specified URL.
func (c *CseSiterestrictListCall) RelatedSite(relatedSite string) *CseSiterestrictListCall {
	c.urlParams_.Set("relatedSite", relatedSite)
	return c
}

// Rights sets the optional parameter "rights": Filters based on
// licensing. Supported values include:
// `cc_publicdomain`,
// `cc_attribute`, `cc_sharealike`, `cc_noncommercial`, `cc_nonderived`
// and
// combinations of these. See
// [typical
// combinations](https://wiki.creativecommons.org/wiki/CC_Search
// _integration).
func (c *CseSiterestrictListCall) Rights(rights string) *CseSiterestrictListCall {
	c.urlParams_.Set("rights", rights)
	return c
}

// Safe sets the optional parameter "safe": Search safety level.
// Acceptable values are:
//
// * "active": Enables SafeSearch filtering.
//
// * "off": Disables SafeSearch filtering. (default)
//
// Possible values:
//   "safeUndefined"
//   "active"
//   "high"
//   "medium"
//   "off"
func (c *CseSiterestrictListCall) Safe(safe string) *CseSiterestrictListCall {
	c.urlParams_.Set("safe", safe)
	return c
}

// SearchType sets the optional parameter "searchType": Specifies the
// search type: `image`. If unspecified, results are limited
// to
// webpages.
//
// Acceptable values are:
//
// * "image": custom image search.
//
// Possible values:
//   "searchTypeUndefined"
//   "image"
func (c *CseSiterestrictListCall) SearchType(searchType string) *CseSiterestrictListCall {
	c.urlParams_.Set("searchType", searchType)
	return c
}

// SiteSearch sets the optional parameter "siteSearch": Specifies a
// given site which should always be included or excluded from
// results (see `siteSearchFilter` parameter, below).
func (c *CseSiterestrictListCall) SiteSearch(siteSearch string) *CseSiterestrictListCall {
	c.urlParams_.Set("siteSearch", siteSearch)
	return c
}

// SiteSearchFilter sets the optional parameter "siteSearchFilter":
// Controls whether to include or exclude results from the site named in
// the
// `siteSearch` parameter.
//
// Acceptable values are:
//
// * "e": exclude
//
// * "i": include
//
// Possible values:
//   "siteSearchFilterUndefined"
//   "e"
//   "i"
func (c *CseSiterestrictListCall) SiteSearchFilter(siteSearchFilter string) *CseSiterestrictListCall {
	c.urlParams_.Set("siteSearchFilter", siteSearchFilter)
	return c
}

// Sort sets the optional parameter "sort": The sort expression to apply
// to the results.
func (c *CseSiterestrictListCall) Sort(sort string) *CseSiterestrictListCall {
	c.urlParams_.Set("sort", sort)
	return c
}

// Start sets the optional parameter "start": The index of the first
// result to return. The default number of results per
// page is 10, so `&start=11` would start at the top of the second page
// of
// results. **Note**: The JSON API will never return more than 100
// results,
// even if more than 100 documents match the query, so setting the sum
// of
// `start + num` to a number greater than 100 will produce an error.
// Also note
// that the maximum value for `num` is 10.
func (c *CseSiterestrictListCall) Start(start int64) *CseSiterestrictListCall {
	c.urlParams_.Set("start", fmt.Sprint(start))
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *CseSiterestrictListCall) Fields(s ...googleapi.Field) *CseSiterestrictListCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets the optional parameter which makes the operation
// fail if the object's ETag matches the given value. This is useful for
// getting updates only after the object has changed since the last
// request. Use googleapi.IsNotModified to check whether the response
// error from Do is the result of In-None-Match.
func (c *CseSiterestrictListCall) IfNoneMatch(entityTag string) *CseSiterestrictListCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *CseSiterestrictListCall) Context(ctx context.Context) *CseSiterestrictListCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *CseSiterestrictListCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *CseSiterestrictListCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200617")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "customsearch/v1/siterestrict")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "search.cse.siterestrict.list" call.
// Exactly one of *Search or error will be non-nil. Any non-2xx status
// code is an error. Response headers are in either
// *Search.ServerResponse.Header or (if a response was returned at all)
// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
// check whether the returned error was because http.StatusNotModified
// was returned.
func (c *CseSiterestrictListCall) Do(opts ...googleapi.CallOption) (*Search, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &Search{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Returns metadata about the search performed, metadata about the custom\nsearch engine used for the search, and the search results. Uses a small set\nof url patterns.",
	//   "flatPath": "customsearch/v1/siterestrict",
	//   "httpMethod": "GET",
	//   "id": "search.cse.siterestrict.list",
	//   "parameterOrder": [],
	//   "parameters": {
	//     "c2coff": {
	//       "description": "Enables or disables [Simplified and Traditional Chinese\nSearch](https://developers.google.com/custom-search/docs/xml_results#chineseSearch).\n\nThe default value for this parameter is 0 (zero), meaning that the feature\nis enabled. Supported values are:\n\n* `1`: Disabled\n\n* `0`: Enabled (default)",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "cr": {
	//       "description": "Restricts search results to documents originating in a particular country.\nYou may use [Boolean\noperators](https://developers.google.com/custom-search/docs/xml_results_appendices#booleanOperators)\nin the cr parameter's value.\n\nGoogle Search determines the country of a document by analyzing:\n\n* the top-level domain (TLD) of the document's URL\n\n* the geographic location of the Web server's IP address\n\nSee the [Country Parameter\nValues](https://developers.google.com/custom-search/docs/xml_results_appendices#countryCollections)\npage for a list of valid values for this parameter.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "cx": {
	//       "description": "The custom search engine ID to use for this request.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "dateRestrict": {
	//       "description": "Restricts results to URLs based on date. Supported values include:\n\n* `d[number]`: requests results from the specified number of past days.\n\n* `w[number]`: requests results from the specified number of past weeks.\n\n* `m[number]`: requests results from the specified number of past months.\n\n* `y[number]`: requests results from the specified number of past years.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "exactTerms": {
	//       "description": "Identifies a phrase that all documents in the search results must contain.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "excludeTerms": {
	//       "description": "Identifies a word or phrase that should not appear in any documents in the\nsearch results.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "fileType": {
	//       "description": "Restricts results to files of a specified extension. A list of file types\nindexable by Google can be found in Search Console [Help\nCenter](https://support.google.com/webmasters/answer/35287).",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "filter": {
	//       "description": "Controls turning on or off the duplicate content filter.\n\n* See [Automatic\nFiltering](https://developers.google.com/custom-search/docs/xml_results#automaticFiltering)\nfor more information about Google's search results filters. Note that host\ncrowding filtering applies only to multi-site searches.\n\n* By default, Google applies filtering to all search results to improve the\nquality of those results.\n\nAcceptable values are:\n\n* `0`: Turns off duplicate content filter.\n\n* `1`: Turns on duplicate content filter.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "gl": {
	//       "description": "Geolocation of end user.\n\n* The `gl` parameter value is a two-letter country code. The `gl` parameter\nboosts search results whose country of origin matches the parameter value.\nSee the [Country\nCodes](https://developers.google.com/custom-search/docs/xml_results_appendices#countryCodes)\npage for a list of valid values.\n\n* Specifying a `gl` parameter value should lead to more relevant results.\nThis is particularly true for international customers and, even more\nspecifically, for customers in English- speaking countries other than the\nUnited States.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "googlehost": {
	//       "description": "**Deprecated**. Use the `gl` parameter for a similar effect.\n\nThe local Google domain (for example, google.com, google.de, or\ngoogle.fr) to use to perform the search.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "highRange": {
	//       "description": "Specifies the ending value for a search range.\n\n* Use `lowRange` and `highRange` to append an inclusive search range of\n`lowRange...highRange` to the query.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "hl": {
	//       "description": "Sets the user interface language.\n\n* Explicitly setting this parameter improves the performance and the\nquality of your search results.\n\n* See the [Interface\nLanguages](https://developers.google.com/custom-search/docs/xml_results#wsInterfaceLanguages)\nsection of [Internationalizing Queries and Results\nPresentation](https://developers.google.com/custom-search/docs/xml_results#wsInternationalizing)\nfor more information, and (Supported Interface\nLanguages)[https://developers.google.com/custom-search/docs/xml_results_appendices#interfaceLanguages]\nfor a list of supported languages.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "hq": {
	//       "description": "Appends the specified query terms to the query, as if they were combined\nwith a logical AND operator.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgColorType": {
	//       "description": "Returns black and white, grayscale, transparent, or color images.\nAcceptable values are:\n\n* `\"color\"`\n\n* `\"gray\"`\n\n* `\"mono\"`: black and white\n\n* `\"trans\"`: transparent background",
	//       "enum": [
	//         "imgColorTypeUndefined",
	//         "mono",
	//         "gray",
	//         "color",
	//         "trans"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgDominantColor": {
	//       "description": "Returns images of a specific dominant color. Acceptable values are:\n\n* `\"black\"`\n\n* `\"blue\"`\n\n* `\"brown\"`\n\n* `\"gray\"`\n\n* `\"green\"`\n\n* `\"orange\"`\n\n* `\"pink\"`\n\n* `\"purple\"`\n\n* `\"red\"`\n\n* `\"teal\"`\n\n* `\"white\"`\n\n* `\"yellow\"`",
	//       "enum": [
	//         "imgDominantColorUndefined",
	//         "black",
	//         "blue",
	//         "brown",
	//         "gray",
	//         "green",
	//         "orange",
	//         "pink",
	//         "purple",
	//         "red",
	//         "teal",
	//         "white",
	//         "yellow"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgSize": {
	//       "description": "Returns images of a specified size. Acceptable values are:\n\n* `\"huge\"`\n\n* `\"icon\"`\n\n* `\"large\"`\n\n* `\"medium\"`\n\n* `\"small\"`\n\n* `\"xlarge\"`\n\n* `\"xxlarge\"`",
	//       "enum": [
	//         "imgSizeUndefined",
	//         "HUGE",
	//         "ICON",
	//         "LARGE",
	//         "MEDIUM",
	//         "SMALL",
	//         "XLARGE",
	//         "XXLARGE"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "imgType": {
	//       "description": "Returns images of a type. Acceptable values are:\n\n* `\"clipart\"`\n\n* `\"face\"`\n\n* `\"lineart\"`\n\n* `\"stock\"`\n\n* `\"photo\"`\n\n* `\"animated\"`",
	//       "enum": [
	//         "imgTypeUndefined",
	//         "clipart",
	//         "face",
	//         "lineart",
	//         "stock",
	//         "photo",
	//         "animated"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "linkSite": {
	//       "description": "Specifies that all search results should contain a link to a particular\nURL.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "lowRange": {
	//       "description": "Specifies the starting value for a search range. Use `lowRange` and\n`highRange` to append an inclusive search range of `lowRange...highRange`\nto the query.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "lr": {
	//       "description": "Restricts the search to documents written in a particular language (e.g.,\n`lr=lang_ja`).\n\nAcceptable values are:\n\n* `\"lang_ar\"`: Arabic\n\n* `\"lang_bg\"`: Bulgarian\n\n* `\"lang_ca\"`: Catalan\n\n* `\"lang_cs\"`: Czech\n\n* `\"lang_da\"`: Danish\n\n* `\"lang_de\"`: German\n\n* `\"lang_el\"`: Greek\n\n* `\"lang_en\"`: English\n\n* `\"lang_es\"`: Spanish\n\n* `\"lang_et\"`: Estonian\n\n* `\"lang_fi\"`: Finnish\n\n* `\"lang_fr\"`: French\n\n* `\"lang_hr\"`: Croatian\n\n* `\"lang_hu\"`: Hungarian\n\n* `\"lang_id\"`: Indonesian\n\n* `\"lang_is\"`: Icelandic\n\n* `\"lang_it\"`: Italian\n\n* `\"lang_iw\"`: Hebrew\n\n* `\"lang_ja\"`: Japanese\n\n* `\"lang_ko\"`: Korean\n\n* `\"lang_lt\"`: Lithuanian\n\n* `\"lang_lv\"`: Latvian\n\n* `\"lang_nl\"`: Dutch\n\n* `\"lang_no\"`: Norwegian\n\n* `\"lang_pl\"`: Polish\n\n* `\"lang_pt\"`: Portuguese\n\n* `\"lang_ro\"`: Romanian\n\n* `\"lang_ru\"`: Russian\n\n* `\"lang_sk\"`: Slovak\n\n* `\"lang_sl\"`: Slovenian\n\n* `\"lang_sr\"`: Serbian\n\n* `\"lang_sv\"`: Swedish\n\n* `\"lang_tr\"`: Turkish\n\n* `\"lang_zh-CN\"`: Chinese (Simplified)\n\n* `\"lang_zh-TW\"`: Chinese (Traditional)",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "num": {
	//       "description": "Number of search results to return.\n\n* Valid values are integers between 1 and 10, inclusive.",
	//       "format": "int32",
	//       "location": "query",
	//       "type": "integer"
	//     },
	//     "orTerms": {
	//       "description": "Provides additional search terms to check for in a document, where each\ndocument in the search results must contain at least one of the additional\nsearch terms.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "q": {
	//       "description": "Query",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "relatedSite": {
	//       "description": "Specifies that all search results should be pages that are related to the\nspecified URL.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "rights": {
	//       "description": "Filters based on licensing. Supported values include: `cc_publicdomain`,\n`cc_attribute`, `cc_sharealike`, `cc_noncommercial`, `cc_nonderived` and\ncombinations of these. See [typical\ncombinations](https://wiki.creativecommons.org/wiki/CC_Search_integration).",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "safe": {
	//       "description": "Search safety level. Acceptable values are:\n\n* `\"active\"`: Enables SafeSearch filtering.\n\n* `\"off\"`: Disables SafeSearch filtering. (default)",
	//       "enum": [
	//         "safeUndefined",
	//         "active",
	//         "high",
	//         "medium",
	//         "off"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "searchType": {
	//       "description": "Specifies the search type: `image`. If unspecified, results are limited to\nwebpages.\n\nAcceptable values are:\n\n* `\"image\"`: custom image search.",
	//       "enum": [
	//         "searchTypeUndefined",
	//         "image"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "siteSearch": {
	//       "description": "Specifies a given site which should always be included or excluded from\nresults (see `siteSearchFilter` parameter, below).",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "siteSearchFilter": {
	//       "description": "Controls whether to include or exclude results from the site named in the\n`siteSearch` parameter.\n\nAcceptable values are:\n\n* `\"e\"`: exclude\n\n* `\"i\"`: include",
	//       "enum": [
	//         "siteSearchFilterUndefined",
	//         "e",
	//         "i"
	//       ],
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "sort": {
	//       "description": "The sort expression to apply to the results.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "start": {
	//       "description": "The index of the first result to return. The default number of results per\npage is 10, so `\u0026start=11` would start at the top of the second page of\nresults. **Note**: The JSON API will never return more than 100 results,\neven if more than 100 documents match the query, so setting the sum of\n`start + num` to a number greater than 100 will produce an error. Also note\nthat the maximum value for `num` is 10.",
	//       "format": "uint32",
	//       "location": "query",
	//       "type": "integer"
	//     }
	//   },
	//   "path": "customsearch/v1/siterestrict",
	//   "response": {
	//     "$ref": "Search"
	//   }
	// }

}
