blob: d1c2472e8eb4075e4fdc0aa7893281a05d99e84b [file] [log] [blame]
Ash Wilsonbdfc3302014-09-04 10:16:28 -04001package endpoints
2
Ash Wilson700d13a2014-09-05 14:24:16 -04003import (
Ash Wilson700d13a2014-09-05 14:24:16 -04004 "github.com/mitchellh/mapstructure"
5 "github.com/rackspace/gophercloud"
Ash Wilson3c8cc772014-09-16 11:40:49 -04006 "github.com/rackspace/gophercloud/pagination"
Ash Wilson700d13a2014-09-05 14:24:16 -04007)
Ash Wilsonbdfc3302014-09-04 10:16:28 -04008
Ash Wilson74e2bb82014-09-30 17:08:48 -04009type commonResult struct {
10 gophercloud.CommonResult
11}
12
13// Extract interprets a GetResult, CreateResult or UpdateResult as a concrete Endpoint.
14// An error is returned if the original call or the extraction failed.
15func (r commonResult) Extract() (*Endpoint, error) {
16 if r.Err != nil {
17 return nil, r.Err
18 }
19
20 var res struct {
21 Endpoint `json:"endpoint"`
22 }
23
24 err := mapstructure.Decode(r.Resp, &res)
Ash Wilson74e2bb82014-09-30 17:08:48 -040025
Jamie Hannaforda253adf2014-10-08 17:14:24 +020026 return &res.Endpoint, err
Ash Wilson74e2bb82014-09-30 17:08:48 -040027}
28
29// CreateResult is the deferred result of a Create call.
30type CreateResult struct {
31 commonResult
32}
33
34// createErr quickly wraps an error in a CreateResult.
35func createErr(err error) CreateResult {
36 return CreateResult{commonResult{gophercloud.CommonResult{Err: err}}}
37}
38
39// UpdateResult is the deferred result of an Update call.
40type UpdateResult struct {
41 commonResult
42}
43
Ash Wilsonbdfc3302014-09-04 10:16:28 -040044// Endpoint describes the entry point for another service's API.
45type Endpoint struct {
Ash Wilson6269f252014-09-12 14:33:56 -040046 ID string `mapstructure:"id" json:"id"`
47 Availability gophercloud.Availability `mapstructure:"interface" json:"interface"`
48 Name string `mapstructure:"name" json:"name"`
49 Region string `mapstructure:"region" json:"region"`
50 ServiceID string `mapstructure:"service_id" json:"service_id"`
51 URL string `mapstructure:"url" json:"url"`
Ash Wilsonbdfc3302014-09-04 10:16:28 -040052}
53
Ash Wilson3c8cc772014-09-16 11:40:49 -040054// EndpointPage is a single page of Endpoint results.
55type EndpointPage struct {
56 pagination.LinkedPageBase
57}
58
59// IsEmpty returns true if no Endpoints were returned.
60func (p EndpointPage) IsEmpty() (bool, error) {
61 es, err := ExtractEndpoints(p)
62 if err != nil {
63 return true, err
64 }
65 return len(es) == 0, nil
66}
67
Ash Wilson6269f252014-09-12 14:33:56 -040068// ExtractEndpoints extracts an Endpoint slice from a Page.
Ash Wilson3c8cc772014-09-16 11:40:49 -040069func ExtractEndpoints(page pagination.Page) ([]Endpoint, error) {
Ash Wilson6269f252014-09-12 14:33:56 -040070 var response struct {
71 Endpoints []Endpoint `mapstructure:"endpoints"`
Ash Wilson700d13a2014-09-05 14:24:16 -040072 }
73
Ash Wilson3c8cc772014-09-16 11:40:49 -040074 err := mapstructure.Decode(page.(EndpointPage).Body, &response)
Jamie Hannaforda253adf2014-10-08 17:14:24 +020075
76 return response.Endpoints, err
Ash Wilson0555c642014-09-05 16:57:17 -040077}