blob: 0ab3b41799e749bd59f6700f9bd605538cc422bc [file] [log] [blame]
Jamie Hannaford4721abc2014-09-16 16:29:04 +02001package apiversions
2
3import (
4 "github.com/mitchellh/mapstructure"
Jamie Hannafordf0c615b2014-09-17 10:56:52 +02005 "github.com/rackspace/gophercloud/pagination"
Jamie Hannaford4721abc2014-09-16 16:29:04 +02006)
7
Jamie Hannaforda311f182014-09-19 11:19:10 +02008// APIVersion represents an API version for Neutron. It contains the status of
9// the API, and its unique ID.
Jamie Hannaford4721abc2014-09-16 16:29:04 +020010type APIVersion struct {
11 Status string `mapstructure:"status" json:"status"`
12 ID string `mapstructure:"id" json:"id"`
13}
14
Jamie Hannaforda311f182014-09-19 11:19:10 +020015// APIVersionPage is the page returned by a pager when traversing over a
16// collection of API versions.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020017type APIVersionPage struct {
18 pagination.SinglePageBase
19}
20
Jamie Hannaforda311f182014-09-19 11:19:10 +020021// IsEmpty checks whether the page is empty.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020022func (r APIVersionPage) IsEmpty() (bool, error) {
23 is, err := ExtractAPIVersions(r)
24 if err != nil {
25 return true, err
26 }
27 return len(is) == 0, nil
28}
29
Jamie Hannaforda311f182014-09-19 11:19:10 +020030// ExtractAPIVersion takes a collection page, extracts all of the elements,
31// and returns them a slice of APIVersion structs. It is effectively a cast.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020032func ExtractAPIVersions(page pagination.Page) ([]APIVersion, error) {
Jamie Hannaford4721abc2014-09-16 16:29:04 +020033 var resp struct {
34 Versions []APIVersion `mapstructure:"versions"`
35 }
36
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020037 err := mapstructure.Decode(page.(APIVersionPage).Body, &resp)
Jamie Hannaford4721abc2014-09-16 16:29:04 +020038 if err != nil {
39 return nil, err
40 }
41
42 return resp.Versions, nil
43}
44
Jamie Hannaforda311f182014-09-19 11:19:10 +020045// APIVersionResource represents a generic API resource. It contains the name
46// of the resource and its plural collection name.
Jamie Hannaford4721abc2014-09-16 16:29:04 +020047type APIVersionResource struct {
48 Name string `mapstructure:"name" json:"name"`
49 Collection string `mapstructure:"collection" json:"collection"`
50}
51
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020052type APIVersionResourcePage struct {
53 pagination.SinglePageBase
54}
55
56func (r APIVersionResourcePage) IsEmpty() (bool, error) {
57 is, err := ExtractVersionResources(r)
58 if err != nil {
59 return true, err
60 }
61 return len(is) == 0, nil
62}
63
64func ExtractVersionResources(page pagination.Page) ([]APIVersionResource, error) {
Jamie Hannaford4721abc2014-09-16 16:29:04 +020065 var resp struct {
66 APIVersionResources []APIVersionResource `mapstructure:"resources"`
67 }
68
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020069 err := mapstructure.Decode(page.(APIVersionResourcePage).Body, &resp)
Jamie Hannaford4721abc2014-09-16 16:29:04 +020070 if err != nil {
71 return nil, err
72 }
73
74 return resp.APIVersionResources, nil
75}