blob: 8c2694b1de5d81589d1a16538c17fcd864b43724 [file] [log] [blame]
// Package civicinfo provides access to the Google Civic Information API.
//
// See https://developers.google.com/civic-information
//
// Usage example:
//
// import "code.google.com/p/google-api-go-client/civicinfo/us_v1"
// ...
// civicinfoService, err := civicinfo.New(oauthHttpClient)
package civicinfo
import (
"bytes"
"code.google.com/p/google-api-go-client/googleapi"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"net/url"
"strconv"
"strings"
)
// 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 _ = googleapi.Version
var _ = errors.New
var _ = strings.Replace
const apiId = "civicinfo:us_v1"
const apiName = "civicinfo"
const apiVersion = "us_v1"
const basePath = "https://www.googleapis.com/civicinfo/us_v1/"
func New(client *http.Client) (*Service, error) {
if client == nil {
return nil, errors.New("client is nil")
}
s := &Service{client: client}
s.Elections = NewElectionsService(s)
s.Representatives = NewRepresentativesService(s)
return s, nil
}
type Service struct {
client *http.Client
Elections *ElectionsService
Representatives *RepresentativesService
}
func NewElectionsService(s *Service) *ElectionsService {
rs := &ElectionsService{s: s}
return rs
}
type ElectionsService struct {
s *Service
}
func NewRepresentativesService(s *Service) *RepresentativesService {
rs := &RepresentativesService{s: s}
return rs
}
type RepresentativesService struct {
s *Service
}
type AdministrationRegion struct {
// ElectionAdministrationBody: The election administration body for this
// area.
ElectionAdministrationBody *AdministrativeBody `json:"electionAdministrationBody,omitempty"`
// Id: An ID for this object. IDs may change in future requests and
// should not be cached. Access to this field requires special access
// that can be requested from the Request more link on the Quotas page.
Id string `json:"id,omitempty"`
// Local_jurisdiction: The city or county that provides election
// information for this voter. This object can have the same elements as
// state.
Local_jurisdiction *AdministrationRegion `json:"local_jurisdiction,omitempty"`
// Name: The name of the jurisdiction.
Name string `json:"name,omitempty"`
// Sources: A list of sources for this area. If multiple sources are
// listed the data has been aggregated from those sources.
Sources []*Source `json:"sources,omitempty"`
}
type AdministrativeBody struct {
// AbsenteeVotingInfoUrl: A URL provided by this administrative body for
// information on absentee voting.
AbsenteeVotingInfoUrl string `json:"absenteeVotingInfoUrl,omitempty"`
// BallotInfoUrl: A URL provided by this administrative body to give
// contest information to the voter.
BallotInfoUrl string `json:"ballotInfoUrl,omitempty"`
// CorrespondenceAddress: The mailing address of this administrative
// body.
CorrespondenceAddress *SimpleAddressType `json:"correspondenceAddress,omitempty"`
// ElectionInfoUrl: A URL provided by this administrative body for
// looking up general election information.
ElectionInfoUrl string `json:"electionInfoUrl,omitempty"`
// ElectionOfficials: The election officials for this election
// administrative body.
ElectionOfficials []*ElectionOfficial `json:"electionOfficials,omitempty"`
// ElectionRegistrationConfirmationUrl: A URL provided by this
// administrative body for confirming that the voter is registered to
// vote.
ElectionRegistrationConfirmationUrl string `json:"electionRegistrationConfirmationUrl,omitempty"`
// ElectionRegistrationUrl: A URL provided by this administrative body
// for looking up how to register to vote.
ElectionRegistrationUrl string `json:"electionRegistrationUrl,omitempty"`
// ElectionRulesUrl: A URL provided by this administrative body
// describing election rules to the voter.
ElectionRulesUrl string `json:"electionRulesUrl,omitempty"`
// HoursOfOperation: A description of the hours of operation for this
// administrative body.
HoursOfOperation string `json:"hoursOfOperation,omitempty"`
// Name: The name of this election administrative body.
Name string `json:"name,omitempty"`
// PhysicalAddress: The physical address of this administrative body.
PhysicalAddress *SimpleAddressType `json:"physicalAddress,omitempty"`
// Voter_services: A description of the services this administrative
// body may provide.
Voter_services []string `json:"voter_services,omitempty"`
// VotingLocationFinderUrl: A URL provided by this administrative body
// for looking up where to vote.
VotingLocationFinderUrl string `json:"votingLocationFinderUrl,omitempty"`
}
type Candidate struct {
// CandidateUrl: The URL for the candidate's campaign web site.
CandidateUrl string `json:"candidateUrl,omitempty"`
// Channels: A list of known (social) media channels for this candidate.
Channels []*Channel `json:"channels,omitempty"`
// Email: The email address for the candidate's campaign.
Email string `json:"email,omitempty"`
// Name: The candidate's name.
Name string `json:"name,omitempty"`
// OrderOnBallot: The order the candidate appears on the ballot for this
// contest.
OrderOnBallot int64 `json:"orderOnBallot,omitempty,string"`
// Party: The full name of the party the candidate is a member of.
Party string `json:"party,omitempty"`
// Phone: The voice phone number for the candidate's campaign office.
Phone string `json:"phone,omitempty"`
// PhotoUrl: A URL for a photo of the candidate.
PhotoUrl string `json:"photoUrl,omitempty"`
}
type Channel struct {
// Id: The unique public identifier for the candidate's channel.
Id string `json:"id,omitempty"`
// Type: The type of channel. The following is a list of types of
// channels, but is not exhaustive. More channel types may be added at a
// later time. One of: GooglePlus, YouTube, Facebook, Twitter
Type string `json:"type,omitempty"`
}
type Contest struct {
// BallotPlacement: A number specifying the position of this contest on
// the voter's ballot.
BallotPlacement int64 `json:"ballotPlacement,omitempty,string"`
// Candidates: The candidate choices for this contest.
Candidates []*Candidate `json:"candidates,omitempty"`
// District: Information about the electoral district that this contest
// is in.
District *ElectoralDistrict `json:"district,omitempty"`
// ElectorateSpecifications: A description of any additional eligibility
// requirements for voting in this contest.
ElectorateSpecifications string `json:"electorateSpecifications,omitempty"`
// Id: An ID for this object. IDs may change in future requests and
// should not be cached. Access to this field requires special access
// that can be requested from the Request more link on the Quotas page.
Id string `json:"id,omitempty"`
// Level: The level of office for this contest. One of: federal, state,
// county, city, other
Level string `json:"level,omitempty"`
// NumberElected: The number of candidates that will be elected to
// office in this contest.
NumberElected int64 `json:"numberElected,omitempty,string"`
// NumberVotingFor: The number of candidates that a voter may vote for
// in this contest.
NumberVotingFor int64 `json:"numberVotingFor,omitempty,string"`
// Office: The name of the office for this contest.
Office string `json:"office,omitempty"`
// PrimaryParty: If this is a partisan election, the name of the party
// it is for.
PrimaryParty string `json:"primaryParty,omitempty"`
// ReferendumSubtitle: A brief description of the referendum. This field
// is only populated for contests of type 'Referendum'.
ReferendumSubtitle string `json:"referendumSubtitle,omitempty"`
// ReferendumTitle: The title of the referendum. (e.g. 'Proposition 42')
// This field is only populated for contests of type 'Referendum'.
ReferendumTitle string `json:"referendumTitle,omitempty"`
// ReferendumUrl: A link the referendum. This field is only populated
// for contests of type 'Referendum'.
ReferendumUrl string `json:"referendumUrl,omitempty"`
// Sources: A list of sources for this contest. If multiple sources are
// listed, the data has been aggregated from those sources.
Sources []*Source `json:"sources,omitempty"`
// Special: "Yes" or "No" depending on whether this a contest being held
// outside the normal election cycle.
Special string `json:"special,omitempty"`
// Type: The type of contest. Usually this will be 'General', 'Primary',
// or 'Run-off' for contests with candidates. For referenda this will be
// 'Referendum'.
Type string `json:"type,omitempty"`
}
type Election struct {
// ElectionDay: Day of the election in YYYY-MM-DD format.
ElectionDay string `json:"electionDay,omitempty"`
// Id: The unique ID of this election.
Id int64 `json:"id,omitempty,string"`
// Name: A displayable name for the election.
Name string `json:"name,omitempty"`
}
type ElectionOfficial struct {
// EmailAddress: The email address of the election official.
EmailAddress string `json:"emailAddress,omitempty"`
// FaxNumber: The fax number of the election official.
FaxNumber string `json:"faxNumber,omitempty"`
// Name: The full name of the election official.
Name string `json:"name,omitempty"`
// OfficePhoneNumber: The office phone number of the election official.
OfficePhoneNumber string `json:"officePhoneNumber,omitempty"`
// Title: The title of the election official.
Title string `json:"title,omitempty"`
}
type ElectionsQueryResponse struct {
// Elections: A list of available elections
Elections []*Election `json:"elections,omitempty"`
// Kind: The kind, fixed to "civicinfo#electionsQueryResponse".
Kind string `json:"kind,omitempty"`
}
type ElectoralDistrict struct {
// Id: An identifier for this district, relative to its scope. For
// example, the 34th State Senate district would have id "34" and a
// scope of stateUpper.
Id string `json:"id,omitempty"`
// Name: The name of the district.
Name string `json:"name,omitempty"`
// Scope: The geographic scope of this district. If unspecified the
// district's geography is not known. One of: statewide, congressional,
// stateUpper, stateLower, countywide, judicial, schoolBoard, cityWide,
// special
Scope string `json:"scope,omitempty"`
}
type GeographicDivision struct {
// Confidence: Numerical value between 0 and 1 that expresses level of
// confidence that a given district is relevant to the request.
Confidence float64 `json:"confidence,omitempty"`
// Name: The name of the division.
Name string `json:"name,omitempty"`
// OcdId: The unique Open Civic Data identifier for this division.
OcdId string `json:"ocdId,omitempty"`
// Offices: List of offices elected from this division.
Offices []*Office `json:"offices,omitempty"`
// Type: The type of this division. If unspecified the division's
// geography is not known.
Type string `json:"type,omitempty"`
}
type Office struct {
// Name: The human-readable name of the office.
Name string `json:"name,omitempty"`
// Officials: A list of people who presently hold the office.
Officials []*Official `json:"officials,omitempty"`
// Sources: A list of sources for this contest. If multiple sources are
// listed, the data has been aggregated from those sources.
Sources []*Source `json:"sources,omitempty"`
}
type Official struct {
// Address: Addresses at which to contact the official.
Address []*SimpleAddressType `json:"address,omitempty"`
// Channels: A list of known (social) media channels for this official.
Channels []*Channel `json:"channels,omitempty"`
// Emails: The direct email addresses for the official.
Emails []string `json:"emails,omitempty"`
// Id: A unique identifier for this official.
Id string `json:"id,omitempty"`
// Name: The official's name.
Name string `json:"name,omitempty"`
// Party: The full name of the party the official belongs to.
Party string `json:"party,omitempty"`
// Phones: The official's public contact phone numbers.
Phones []string `json:"phones,omitempty"`
// PhotoUrl: A URL for a photo of the official.
PhotoUrl string `json:"photoUrl,omitempty"`
// Urls: The official's public website URLs.
Urls []string `json:"urls,omitempty"`
}
type PollingLocation struct {
// Address: The address of the location
Address *SimpleAddressType `json:"address,omitempty"`
// EndDate: The last date that this early vote site may be used. This
// field is not populated for polling locations.
EndDate string `json:"endDate,omitempty"`
// Id: An ID for this object. IDs may change in future requests and
// should not be cached. Access to this field requires special access
// that can be requested from the Request more link on the Quotas page.
Id string `json:"id,omitempty"`
// Name: The name of the early vote site. This field is not populated
// for polling locations.
Name string `json:"name,omitempty"`
// Notes: Notes about this location (e.g. accessibility ramp or entrance
// to use)
Notes string `json:"notes,omitempty"`
// PollingHours: A description of when this location is open.
PollingHours string `json:"pollingHours,omitempty"`
// Sources: A list of sources for this location. If multiple sources are
// listed the data has been aggregated from those sources.
Sources []*Source `json:"sources,omitempty"`
// StartDate: The first date that this early vote site may be used. This
// field is not populated for polling locations.
StartDate string `json:"startDate,omitempty"`
// VoterServices: The services provided by this early vote site. This
// field is not populated for polling locations.
VoterServices string `json:"voterServices,omitempty"`
}
type RepresentativeInfoRequest struct {
Address string `json:"address,omitempty"`
}
type RepresentativeInfoResponse struct {
// Divisions: Political geographic divisions that contain the requested
// address.
Divisions []*GeographicDivision `json:"divisions,omitempty"`
// Kind: The kind, fixed to "civicinfo#representativeInfoResponse".
Kind string `json:"kind,omitempty"`
// NormalizedInput: The normalized version of the requested address
NormalizedInput *SimpleAddressType `json:"normalizedInput,omitempty"`
// Offices: Elected offices referenced by the divisions listed above.
// Will only be present if "offices" was true in the request.
Offices []*Office `json:"offices,omitempty"`
// Officials: Officials holding the offices listed above. Will only be
// present if "offices" was true in the request.
Officials []*Official `json:"officials,omitempty"`
// Status: The result of the request. One of: success,
// noStreetSegmentFound, addressUnparseable, noAddressParameter,
// multipleStreetSegmentsFound, electionOver, electionUnknown,
// internalLookupFailure
Status string `json:"status,omitempty"`
}
type SimpleAddressType struct {
// City: The city or town for the address.
City string `json:"city,omitempty"`
// Line1: The street name and number of this address.
Line1 string `json:"line1,omitempty"`
// Line2: The second line the address, if needed.
Line2 string `json:"line2,omitempty"`
// Line3: The third line of the address, if needed.
Line3 string `json:"line3,omitempty"`
// LocationName: The name of the location.
LocationName string `json:"locationName,omitempty"`
// State: The US two letter state abbreviation of the address.
State string `json:"state,omitempty"`
// Zip: The US Postal Zip Code of the address.
Zip string `json:"zip,omitempty"`
}
type Source struct {
// Name: The name of the data source.
Name string `json:"name,omitempty"`
// Official: Whether this data comes from an official government source.
Official bool `json:"official,omitempty"`
}
type VoterInfoRequest struct {
// Address: The registered address of the voter to look up.
Address string `json:"address,omitempty"`
}
type VoterInfoResponse struct {
// Contests: Contests that will appear on the voter's ballot
Contests []*Contest `json:"contests,omitempty"`
// EarlyVoteSites: Locations where the voter is eligible to vote early,
// prior to election day
EarlyVoteSites []*PollingLocation `json:"earlyVoteSites,omitempty"`
// Election: The election that was queried.
Election *Election `json:"election,omitempty"`
// Kind: The kind, fixed to "civicinfo#voterInfoResponse".
Kind string `json:"kind,omitempty"`
// NormalizedInput: The normalized version of the requested address
NormalizedInput *SimpleAddressType `json:"normalizedInput,omitempty"`
// PollingLocations: Locations where the voter is eligible to vote on
// election day. For states with mail-in voting only, these locations
// will be nearby drop box locations. Drop box locations are free to the
// voter and may be used instead of placing the ballot in the mail.
PollingLocations []*PollingLocation `json:"pollingLocations,omitempty"`
// State: Local Election Information for the state that the voter votes
// in. For the US, there will only be one element in this array.
State []*AdministrationRegion `json:"state,omitempty"`
// Status: The result of the request. One of: success,
// noStreetSegmentFound, addressUnparseable, noAddressParameter,
// multipleStreetSegmentsFound, electionOver, electionUnknown,
// internalLookupFailure
Status string `json:"status,omitempty"`
}
// method id "civicinfo.elections.electionQuery":
type ElectionsElectionQueryCall struct {
s *Service
opt_ map[string]interface{}
}
// ElectionQuery: List of available elections to query.
func (r *ElectionsService) ElectionQuery() *ElectionsElectionQueryCall {
c := &ElectionsElectionQueryCall{s: r.s, opt_: make(map[string]interface{})}
return c
}
func (c *ElectionsElectionQueryCall) Do() (*ElectionsQueryResponse, error) {
var body io.Reader = nil
params := make(url.Values)
params.Set("alt", "json")
urls := googleapi.ResolveRelative("https://www.googleapis.com/civicinfo/us_v1/", "elections")
urls += "?" + params.Encode()
req, _ := http.NewRequest("GET", urls, body)
googleapi.SetOpaque(req.URL)
req.Header.Set("User-Agent", "google-api-go-client/0.5")
res, err := c.s.client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
if err := googleapi.CheckResponse(res); err != nil {
return nil, err
}
ret := new(ElectionsQueryResponse)
if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
return nil, err
}
return ret, nil
// {
// "description": "List of available elections to query.",
// "httpMethod": "GET",
// "id": "civicinfo.elections.electionQuery",
// "path": "elections",
// "response": {
// "$ref": "ElectionsQueryResponse"
// }
// }
}
// method id "civicinfo.elections.voterInfoQuery":
type ElectionsVoterInfoQueryCall struct {
s *Service
electionId int64
voterinforequest *VoterInfoRequest
opt_ map[string]interface{}
}
// VoterInfoQuery: Looks up information relevant to a voter based on the
// voter's registered address.
func (r *ElectionsService) VoterInfoQuery(electionId int64, voterinforequest *VoterInfoRequest) *ElectionsVoterInfoQueryCall {
c := &ElectionsVoterInfoQueryCall{s: r.s, opt_: make(map[string]interface{})}
c.electionId = electionId
c.voterinforequest = voterinforequest
return c
}
// OfficialOnly sets the optional parameter "officialOnly": If set to
// true, only data from official state sources will be returned.
func (c *ElectionsVoterInfoQueryCall) OfficialOnly(officialOnly bool) *ElectionsVoterInfoQueryCall {
c.opt_["officialOnly"] = officialOnly
return c
}
func (c *ElectionsVoterInfoQueryCall) Do() (*VoterInfoResponse, error) {
var body io.Reader = nil
body, err := googleapi.WithoutDataWrapper.JSONReader(c.voterinforequest)
if err != nil {
return nil, err
}
ctype := "application/json"
params := make(url.Values)
params.Set("alt", "json")
if v, ok := c.opt_["officialOnly"]; ok {
params.Set("officialOnly", fmt.Sprintf("%v", v))
}
urls := googleapi.ResolveRelative("https://www.googleapis.com/civicinfo/us_v1/", "voterinfo/{electionId}/lookup")
urls += "?" + params.Encode()
req, _ := http.NewRequest("POST", urls, body)
req.URL.Path = strings.Replace(req.URL.Path, "{electionId}", strconv.FormatInt(c.electionId, 10), 1)
googleapi.SetOpaque(req.URL)
req.Header.Set("Content-Type", ctype)
req.Header.Set("User-Agent", "google-api-go-client/0.5")
res, err := c.s.client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
if err := googleapi.CheckResponse(res); err != nil {
return nil, err
}
ret := new(VoterInfoResponse)
if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
return nil, err
}
return ret, nil
// {
// "description": "Looks up information relevant to a voter based on the voter's registered address.",
// "httpMethod": "POST",
// "id": "civicinfo.elections.voterInfoQuery",
// "parameterOrder": [
// "electionId"
// ],
// "parameters": {
// "electionId": {
// "description": "The unique ID of the election to look up. A list of election IDs can be obtained at.https://www.googleapis.com/civicinfo/{version}/elections",
// "format": "int64",
// "location": "path",
// "required": true,
// "type": "string"
// },
// "officialOnly": {
// "default": "false",
// "description": "If set to true, only data from official state sources will be returned.",
// "location": "query",
// "type": "boolean"
// }
// },
// "path": "voterinfo/{electionId}/lookup",
// "request": {
// "$ref": "VoterInfoRequest"
// },
// "response": {
// "$ref": "VoterInfoResponse"
// }
// }
}
// method id "civicinfo.representatives.representativeInfoQuery":
type RepresentativesRepresentativeInfoQueryCall struct {
s *Service
representativeinforequest *RepresentativeInfoRequest
opt_ map[string]interface{}
}
// RepresentativeInfoQuery: Looks up political geography and
// (optionally) representative information based on an address.
func (r *RepresentativesService) RepresentativeInfoQuery(representativeinforequest *RepresentativeInfoRequest) *RepresentativesRepresentativeInfoQueryCall {
c := &RepresentativesRepresentativeInfoQueryCall{s: r.s, opt_: make(map[string]interface{})}
c.representativeinforequest = representativeinforequest
return c
}
// IncludeOffices sets the optional parameter "includeOffices": Whether
// to return information about offices and officials. If false, only the
// top-level district information will be returned.
func (c *RepresentativesRepresentativeInfoQueryCall) IncludeOffices(includeOffices bool) *RepresentativesRepresentativeInfoQueryCall {
c.opt_["includeOffices"] = includeOffices
return c
}
func (c *RepresentativesRepresentativeInfoQueryCall) Do() (*RepresentativeInfoResponse, error) {
var body io.Reader = nil
body, err := googleapi.WithoutDataWrapper.JSONReader(c.representativeinforequest)
if err != nil {
return nil, err
}
ctype := "application/json"
params := make(url.Values)
params.Set("alt", "json")
if v, ok := c.opt_["includeOffices"]; ok {
params.Set("includeOffices", fmt.Sprintf("%v", v))
}
urls := googleapi.ResolveRelative("https://www.googleapis.com/civicinfo/us_v1/", "representatives/lookup")
urls += "?" + params.Encode()
req, _ := http.NewRequest("POST", urls, body)
googleapi.SetOpaque(req.URL)
req.Header.Set("Content-Type", ctype)
req.Header.Set("User-Agent", "google-api-go-client/0.5")
res, err := c.s.client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
if err := googleapi.CheckResponse(res); err != nil {
return nil, err
}
ret := new(RepresentativeInfoResponse)
if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
return nil, err
}
return ret, nil
// {
// "description": "Looks up political geography and (optionally) representative information based on an address.",
// "httpMethod": "POST",
// "id": "civicinfo.representatives.representativeInfoQuery",
// "parameters": {
// "includeOffices": {
// "default": "true",
// "description": "Whether to return information about offices and officials. If false, only the top-level district information will be returned.",
// "location": "query",
// "type": "boolean"
// }
// },
// "path": "representatives/lookup",
// "request": {
// "$ref": "RepresentativeInfoRequest"
// },
// "response": {
// "$ref": "RepresentativeInfoResponse"
// }
// }
}