1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
package projects
import (
"encoding/json"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/internal"
"github.com/gophercloud/gophercloud/pagination"
)
// Option is a specific option defined at the API to enable features
// on a project.
type Option string
const (
Immutable Option = "immutable"
)
type projectResult struct {
gophercloud.Result
}
// GetResult is the result of a Get request. Call its Extract method to
// interpret it as a Project.
type GetResult struct {
projectResult
}
// CreateResult is the result of a Create request. Call its Extract method to
// interpret it as a Project.
type CreateResult struct {
projectResult
}
// DeleteResult is the result of a Delete request. Call its ExtractErr method to
// determine if the request succeeded or failed.
type DeleteResult struct {
gophercloud.ErrResult
}
// UpdateResult is the result of an Update request. Call its Extract method to
// interpret it as a Project.
type UpdateResult struct {
projectResult
}
// Project represents an OpenStack Identity Project.
type Project struct {
// IsDomain indicates whether the project is a domain.
IsDomain bool `json:"is_domain"`
// Description is the description of the project.
Description string `json:"description"`
// DomainID is the domain ID the project belongs to.
DomainID string `json:"domain_id"`
// Enabled is whether or not the project is enabled.
Enabled bool `json:"enabled"`
// ID is the unique ID of the project.
ID string `json:"id"`
// Name is the name of the project.
Name string `json:"name"`
// ParentID is the parent_id of the project.
ParentID string `json:"parent_id"`
// Tags is the list of tags associated with the project.
Tags []string `json:"tags,omitempty"`
// Extra is free-form extra key/value pairs to describe the project.
Extra map[string]interface{} `json:"-"`
// Options are defined options in the API to enable certain features.
Options map[Option]interface{} `json:"options,omitempty"`
}
func (r *Project) UnmarshalJSON(b []byte) error {
type tmp Project
var s struct {
tmp
Extra map[string]interface{} `json:"extra"`
}
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
*r = Project(s.tmp)
// Collect other fields and bundle them into Extra
// but only if a field titled "extra" wasn't sent.
if s.Extra != nil {
r.Extra = s.Extra
} else {
var result interface{}
err := json.Unmarshal(b, &result)
if err != nil {
return err
}
if resultMap, ok := result.(map[string]interface{}); ok {
r.Extra = internal.RemainingKeys(Project{}, resultMap)
}
}
return err
}
// ProjectPage is a single page of Project results.
type ProjectPage struct {
pagination.LinkedPageBase
}
// IsEmpty determines whether or not a page of Projects contains any results.
func (r ProjectPage) IsEmpty() (bool, error) {
projects, err := ExtractProjects(r)
return len(projects) == 0, err
}
// NextPageURL extracts the "next" link from the links section of the result.
func (r ProjectPage) NextPageURL() (string, error) {
var s struct {
Links struct {
Next string `json:"next"`
Previous string `json:"previous"`
} `json:"links"`
}
err := r.ExtractInto(&s)
if err != nil {
return "", err
}
return s.Links.Next, err
}
// ExtractProjects returns a slice of Projects contained in a single page of
// results.
func ExtractProjects(r pagination.Page) ([]Project, error) {
var s struct {
Projects []Project `json:"projects"`
}
err := (r.(ProjectPage)).ExtractInto(&s)
return s.Projects, err
}
// Extract interprets any projectResults as a Project.
func (r projectResult) Extract() (*Project, error) {
var s struct {
Project *Project `json:"project"`
}
err := r.ExtractInto(&s)
return s.Project, err
}
|