blob: 2dd2357d693b261ff9afda942b179815110befac [file] [log] [blame]
Ash Wilsonbdfc3302014-09-04 10:16:28 -04001package endpoints
2
Ash Wilson700d13a2014-09-05 14:24:16 -04003import (
Ash Wilson74e2bb82014-09-30 17:08:48 -04004 "fmt"
5
Ash Wilson700d13a2014-09-05 14:24:16 -04006 "github.com/mitchellh/mapstructure"
7 "github.com/rackspace/gophercloud"
Ash Wilson3c8cc772014-09-16 11:40:49 -04008 "github.com/rackspace/gophercloud/pagination"
Ash Wilson700d13a2014-09-05 14:24:16 -04009)
Ash Wilsonbdfc3302014-09-04 10:16:28 -040010
Ash Wilson74e2bb82014-09-30 17:08:48 -040011type commonResult struct {
12 gophercloud.CommonResult
13}
14
15// Extract interprets a GetResult, CreateResult or UpdateResult as a concrete Endpoint.
16// An error is returned if the original call or the extraction failed.
17func (r commonResult) Extract() (*Endpoint, error) {
18 if r.Err != nil {
19 return nil, r.Err
20 }
21
22 var res struct {
23 Endpoint `json:"endpoint"`
24 }
25
26 err := mapstructure.Decode(r.Resp, &res)
27 if err != nil {
28 return nil, fmt.Errorf("Error decoding Endpoint: %v", err)
29 }
30
31 return &res.Endpoint, nil
32}
33
34// CreateResult is the deferred result of a Create call.
35type CreateResult struct {
36 commonResult
37}
38
39// createErr quickly wraps an error in a CreateResult.
40func createErr(err error) CreateResult {
41 return CreateResult{commonResult{gophercloud.CommonResult{Err: err}}}
42}
43
44// UpdateResult is the deferred result of an Update call.
45type UpdateResult struct {
46 commonResult
47}
48
Ash Wilsonbdfc3302014-09-04 10:16:28 -040049// Endpoint describes the entry point for another service's API.
50type Endpoint struct {
Ash Wilson6269f252014-09-12 14:33:56 -040051 ID string `mapstructure:"id" json:"id"`
52 Availability gophercloud.Availability `mapstructure:"interface" json:"interface"`
53 Name string `mapstructure:"name" json:"name"`
54 Region string `mapstructure:"region" json:"region"`
55 ServiceID string `mapstructure:"service_id" json:"service_id"`
56 URL string `mapstructure:"url" json:"url"`
Ash Wilsonbdfc3302014-09-04 10:16:28 -040057}
58
Ash Wilson3c8cc772014-09-16 11:40:49 -040059// EndpointPage is a single page of Endpoint results.
60type EndpointPage struct {
61 pagination.LinkedPageBase
62}
63
64// IsEmpty returns true if no Endpoints were returned.
65func (p EndpointPage) IsEmpty() (bool, error) {
66 es, err := ExtractEndpoints(p)
67 if err != nil {
68 return true, err
69 }
70 return len(es) == 0, nil
71}
72
Ash Wilson6269f252014-09-12 14:33:56 -040073// ExtractEndpoints extracts an Endpoint slice from a Page.
Ash Wilson3c8cc772014-09-16 11:40:49 -040074func ExtractEndpoints(page pagination.Page) ([]Endpoint, error) {
Ash Wilson6269f252014-09-12 14:33:56 -040075 var response struct {
76 Endpoints []Endpoint `mapstructure:"endpoints"`
Ash Wilson700d13a2014-09-05 14:24:16 -040077 }
78
Ash Wilson3c8cc772014-09-16 11:40:49 -040079 err := mapstructure.Decode(page.(EndpointPage).Body, &response)
Ash Wilson700d13a2014-09-05 14:24:16 -040080 if err != nil {
81 return nil, err
82 }
Ash Wilson6269f252014-09-12 14:33:56 -040083 return response.Endpoints, nil
Ash Wilson0555c642014-09-05 16:57:17 -040084}