blob: f480bc7ca394b89214c3372c075efafb100c4b19 [file] [log] [blame]
Jamie Hannaford4baa1232014-09-23 15:23:04 +02001package gophercloud
Jamie Hannafordb3120f52014-09-23 15:17:57 +02002
Ash Wilsone8192ac2014-10-21 09:02:01 -04003import (
4 "encoding/json"
5 "net/http"
6)
Ash Wilsoneab6a702014-10-20 08:18:30 -04007
8// Result acts as a base struct that other results can embed.
9type Result struct {
Ash Wilsond3dc2542014-10-20 10:10:48 -040010 // Body is the payload of the HTTP response from the server. In most cases, this will be the
11 // deserialized JSON structure.
12 Body interface{}
Ash Wilsoneab6a702014-10-20 08:18:30 -040013
Ash Wilson72e4d2c2014-10-20 10:27:30 -040014 // Header contains the HTTP header structure from the original response.
15 Header http.Header
Ash Wilsoneab6a702014-10-20 08:18:30 -040016
17 // Err is an error that occurred during the operation. It's deferred until extraction to make
18 // it easier to chain operations.
19 Err error
Jamie Hannafordb3120f52014-09-23 15:17:57 +020020}
Ash Wilsona6b08312014-10-02 15:27:45 -040021
Ash Wilsone8192ac2014-10-21 09:02:01 -040022// PrettyPrintJSON creates a string containing the full response body as pretty-printed JSON.
23func (r Result) PrettyPrintJSON() string {
24 pretty, err := json.MarshalIndent(r.Body, "", " ")
25 if err != nil {
26 panic(err.Error())
27 }
28 return string(pretty)
29}
30
Jon Perrittba2395e2014-10-27 15:23:21 -050031// ErrResult represents results that only contain a potential error and
Jamie Hannaford021b35c2014-10-27 14:01:53 +010032// nothing else. Usually if the operation executed successfully, the Err field
33// will be nil; otherwise it will be stocked with a relevant error.
Jon Perrittba2395e2014-10-27 15:23:21 -050034type ErrResult struct {
Jon Perritt0c2b0372014-10-27 15:57:29 -050035 Result
Jamie Hannaford021b35c2014-10-27 14:01:53 +010036}
37
Jon Perritt0c2b0372014-10-27 15:57:29 -050038// ExtractErr is a function that extracts error information from a result.
Jon Perrittba2395e2014-10-27 15:23:21 -050039func (r ErrResult) ExtractErr() error {
Jamie Hannaford021b35c2014-10-27 14:01:53 +010040 return r.Err
41}
42
Jon Perrittd50f93e2014-10-27 14:19:27 -050043// HeaderResult represents a result that only contains an `error` (possibly nil)
44// and an http.Header. This is used, for example, by the `objectstorage` packages
Jon Perritt0c2b0372014-10-27 15:57:29 -050045// in `openstack`, because most of the operations don't return response bodies.
Jon Perrittd50f93e2014-10-27 14:19:27 -050046type HeaderResult struct {
Jon Perritt0c2b0372014-10-27 15:57:29 -050047 Result
Jon Perrittd50f93e2014-10-27 14:19:27 -050048}
49
50// ExtractHeader will return the http.Header and error from the HeaderResult.
51// Usage: header, err := objects.Create(client, "my_container", objects.CreateOpts{}).ExtractHeader()
52func (hr HeaderResult) ExtractHeader() (http.Header, error) {
53 return hr.Header, hr.Err
54}
55
Ash Wilsona6b08312014-10-02 15:27:45 -040056// RFC3339Milli describes a time format used by API responses.
57const RFC3339Milli = "2006-01-02T15:04:05.999999Z"
Jamie Hannaford369c9c62014-10-08 15:14:43 +020058
59// Link represents a structure that enables paginated collections how to
60// traverse backward or forward. The "Rel" field is usually either "next".
61type Link struct {
62 Href string `mapstructure:"href"`
63 Rel string `mapstructure:"rel"`
64}
65
66// ExtractNextURL attempts to extract the next URL from a JSON structure. It
Jamie Hannafordb280dea2014-10-24 15:14:06 +020067// follows the common convention of nesting back and next URLs in a "links"
68// JSON array.
Jamie Hannaford369c9c62014-10-08 15:14:43 +020069func ExtractNextURL(links []Link) (string, error) {
70 var url string
71
72 for _, l := range links {
73 if l.Rel == "next" {
74 url = l.Href
75 }
76 }
77
78 if url == "" {
79 return "", nil
80 }
81
82 return url, nil
83}