blob: 97159341ffbda2b041701e76aefb383642494212 [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 Hannafordc65e1922014-09-22 13:20:58 +020021// IsEmpty checks whether an APIVersionPage struct 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 Hannafordc65e1922014-09-22 13:20:58 +020030// ExtractAPIVersions takes a collection page, extracts all of the elements,
Jamie Hannaforda311f182014-09-19 11:19:10 +020031// 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
Jamie Hannafordc1f36492014-10-08 15:48:48 +020039 return resp.Versions, err
Jamie Hannaford4721abc2014-09-16 16:29:04 +020040}
41
Jamie Hannaforda311f182014-09-19 11:19:10 +020042// APIVersionResource represents a generic API resource. It contains the name
43// of the resource and its plural collection name.
Jamie Hannaford4721abc2014-09-16 16:29:04 +020044type APIVersionResource struct {
45 Name string `mapstructure:"name" json:"name"`
46 Collection string `mapstructure:"collection" json:"collection"`
47}
48
Jamie Hannafordc65e1922014-09-22 13:20:58 +020049// APIVersionResourcePage is a concrete type which embeds the common
50// SinglePageBase struct, and is used when traversing API versions collections.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020051type APIVersionResourcePage struct {
52 pagination.SinglePageBase
53}
54
Jamie Hannafordc65e1922014-09-22 13:20:58 +020055// IsEmpty is a concrete function which indicates whether an
56// APIVersionResourcePage is empty or not.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020057func (r APIVersionResourcePage) IsEmpty() (bool, error) {
58 is, err := ExtractVersionResources(r)
59 if err != nil {
60 return true, err
61 }
62 return len(is) == 0, nil
63}
64
Jamie Hannafordc65e1922014-09-22 13:20:58 +020065// ExtractVersionResources accepts a Page struct, specifically a
66// APIVersionResourcePage struct, and extracts the elements into a slice of
67// APIVersionResource structs. In other words, the collection is mapped into
68// a relevant slice.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020069func ExtractVersionResources(page pagination.Page) ([]APIVersionResource, error) {
Jamie Hannaford4721abc2014-09-16 16:29:04 +020070 var resp struct {
71 APIVersionResources []APIVersionResource `mapstructure:"resources"`
72 }
73
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020074 err := mapstructure.Decode(page.(APIVersionResourcePage).Body, &resp)
Jamie Hannaford4721abc2014-09-16 16:29:04 +020075
Jamie Hannafordc1f36492014-10-08 15:48:48 +020076 return resp.APIVersionResources, err
Jamie Hannaford4721abc2014-09-16 16:29:04 +020077}