remove mapstructure from identity,networking,objectstorage,orchestration,pagination
diff --git a/openstack/orchestration/v1/stackresources/results.go b/openstack/orchestration/v1/stackresources/results.go
index edbd34f..951f144 100644
--- a/openstack/orchestration/v1/stackresources/results.go
+++ b/openstack/orchestration/v1/stackresources/results.go
@@ -2,29 +2,25 @@
import (
"encoding/json"
- "fmt"
- "reflect"
- "time"
- "github.com/mitchellh/mapstructure"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
// Resource represents a stack resource.
type Resource struct {
- Attributes map[string]interface{} `mapstructure:"attributes"`
- CreationTime time.Time `mapstructure:"-"`
- Description string `mapstructure:"description"`
- Links []gophercloud.Link `mapstructure:"links"`
- LogicalID string `mapstructure:"logical_resource_id"`
- Name string `mapstructure:"resource_name"`
- PhysicalID string `mapstructure:"physical_resource_id"`
- RequiredBy []interface{} `mapstructure:"required_by"`
- Status string `mapstructure:"resource_status"`
- StatusReason string `mapstructure:"resource_status_reason"`
- Type string `mapstructure:"resource_type"`
- UpdatedTime time.Time `mapstructure:"-"`
+ Attributes map[string]interface{} `json:"attributes"`
+ CreationTime gophercloud.JSONRFC3339NoZ `json:"creation_time"`
+ Description string `json:"description"`
+ Links []gophercloud.Link `json:"links"`
+ LogicalID string `json:"logical_resource_id"`
+ Name string `json:"resource_name"`
+ PhysicalID string `json:"physical_resource_id"`
+ RequiredBy []interface{} `json:"required_by"`
+ Status string `json:"resource_status"`
+ StatusReason string `json:"resource_status_reason"`
+ Type string `json:"resource_type"`
+ UpdatedTime gophercloud.JSONRFC3339NoZ `json:"updated_time"`
}
// FindResult represents the result of a Find operation.
@@ -35,39 +31,11 @@
// Extract returns a slice of Resource objects and is called after a
// Find operation.
func (r FindResult) Extract() ([]Resource, error) {
- if r.Err != nil {
- return nil, r.Err
+ var s struct {
+ Resources []Resource `json:"resources"`
}
-
- var res struct {
- Res []Resource `mapstructure:"resources"`
- }
-
- if err := mapstructure.Decode(r.Body, &res); err != nil {
- return nil, err
- }
-
- resources := r.Body.(map[string]interface{})["resources"].([]interface{})
-
- for i, resourceRaw := range resources {
- resource := resourceRaw.(map[string]interface{})
- if date, ok := resource["updated_time"]; ok && date != nil {
- t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
- if err != nil {
- return nil, err
- }
- res.Res[i].UpdatedTime = t
- }
- if date, ok := resource["creation_time"]; ok && date != nil {
- t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
- if err != nil {
- return nil, err
- }
- res.Res[i].CreationTime = t
- }
- }
-
- return res.Res, nil
+ err := r.ExtractInto(&s)
+ return s.Resources, err
}
// ResourcePage abstracts the raw results of making a List() request against the API.
@@ -80,51 +48,16 @@
// IsEmpty returns true if a page contains no Server results.
func (r ResourcePage) IsEmpty() (bool, error) {
resources, err := ExtractResources(r)
- if err != nil {
- return true, err
- }
- return len(resources) == 0, nil
+ return len(resources) == 0, err
}
// ExtractResources interprets the results of a single page from a List() call, producing a slice of Resource entities.
-func ExtractResources(page pagination.Page) ([]Resource, error) {
- casted := page.(ResourcePage).Body
-
- var response struct {
- Resources []Resource `mapstructure:"resources"`
+func ExtractResources(r pagination.Page) ([]Resource, error) {
+ var s struct {
+ Resources []Resource `json:"resources"`
}
- if err := mapstructure.Decode(casted, &response); err != nil {
- return nil, err
- }
- var resources []interface{}
- switch casted.(type) {
- case map[string]interface{}:
- resources = casted.(map[string]interface{})["resources"].([]interface{})
- case map[string][]interface{}:
- resources = casted.(map[string][]interface{})["resources"]
- default:
- return response.Resources, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
- }
-
- for i, resourceRaw := range resources {
- resource := resourceRaw.(map[string]interface{})
- if date, ok := resource["updated_time"]; ok && date != nil {
- t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
- if err != nil {
- return nil, err
- }
- response.Resources[i].UpdatedTime = t
- }
- if date, ok := resource["creation_time"]; ok && date != nil {
- t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
- if err != nil {
- return nil, err
- }
- response.Resources[i].CreationTime = t
- }
- }
-
- return response.Resources, nil
+ err := (r.(ResourcePage)).ExtractInto(&s)
+ return s.Resources, err
}
// GetResult represents the result of a Get operation.
@@ -135,36 +68,11 @@
// Extract returns a pointer to a Resource object and is called after a
// Get operation.
func (r GetResult) Extract() (*Resource, error) {
- if r.Err != nil {
- return nil, r.Err
+ var s struct {
+ Resource *Resource `json:"resource"`
}
-
- var res struct {
- Res *Resource `mapstructure:"resource"`
- }
-
- if err := mapstructure.Decode(r.Body, &res); err != nil {
- return nil, err
- }
-
- resource := r.Body.(map[string]interface{})["resource"].(map[string]interface{})
-
- if date, ok := resource["updated_time"]; ok && date != nil {
- t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
- if err != nil {
- return nil, err
- }
- res.Res.UpdatedTime = t
- }
- if date, ok := resource["creation_time"]; ok && date != nil {
- t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
- if err != nil {
- return nil, err
- }
- res.Res.CreationTime = t
- }
-
- return res.Res, nil
+ err := r.ExtractInto(&s)
+ return s.Resource, err
}
// MetadataResult represents the result of a Metadata operation.
@@ -175,19 +83,11 @@
// Extract returns a map object and is called after a
// Metadata operation.
func (r MetadataResult) Extract() (map[string]string, error) {
- if r.Err != nil {
- return nil, r.Err
+ var s struct {
+ Meta map[string]string `json:"metadata"`
}
-
- var res struct {
- Meta map[string]string `mapstructure:"metadata"`
- }
-
- if err := mapstructure.Decode(r.Body, &res); err != nil {
- return nil, err
- }
-
- return res.Meta, nil
+ err := r.ExtractInto(&s)
+ return s.Meta, err
}
// ResourceTypePage abstracts the raw results of making a ListTypes() request against the API.
@@ -200,10 +100,7 @@
// IsEmpty returns true if a ResourceTypePage contains no resource types.
func (r ResourceTypePage) IsEmpty() (bool, error) {
rts, err := ExtractResourceTypes(r)
- if err != nil {
- return true, err
- }
- return len(rts) == 0, nil
+ return len(rts) == 0, err
}
// ResourceTypes represents the type that holds the result of ExtractResourceTypes.
@@ -223,25 +120,20 @@
}
// ExtractResourceTypes extracts and returns resource types.
-func ExtractResourceTypes(page pagination.Page) (ResourceTypes, error) {
- casted := page.(ResourceTypePage).Body
-
- var response struct {
- ResourceTypes ResourceTypes `mapstructure:"resource_types"`
+func ExtractResourceTypes(r pagination.Page) (ResourceTypes, error) {
+ var s struct {
+ ResourceTypes ResourceTypes `json:"resource_types"`
}
-
- if err := mapstructure.Decode(casted, &response); err != nil {
- return nil, err
- }
- return response.ResourceTypes, nil
+ err := (r.(ResourceTypePage)).ExtractInto(&s)
+ return s.ResourceTypes, err
}
// TypeSchema represents a stack resource schema.
type TypeSchema struct {
- Attributes map[string]interface{} `mapstructure:"attributes"`
- Properties map[string]interface{} `mapstrucutre:"properties"`
- ResourceType string `mapstructure:"resource_type"`
- SupportStatus map[string]interface{} `mapstructure:"support_status"`
+ Attributes map[string]interface{} `json:"attributes"`
+ Properties map[string]interface{} `json:"properties"`
+ ResourceType string `json:"resource_type"`
+ SupportStatus map[string]interface{} `json:"support_status"`
}
// SchemaResult represents the result of a Schema operation.
@@ -252,17 +144,9 @@
// Extract returns a pointer to a TypeSchema object and is called after a
// Schema operation.
func (r SchemaResult) Extract() (*TypeSchema, error) {
- if r.Err != nil {
- return nil, r.Err
- }
-
- var res TypeSchema
-
- if err := mapstructure.Decode(r.Body, &res); err != nil {
- return nil, err
- }
-
- return &res, nil
+ var s *TypeSchema
+ err := r.ExtractInto(&s)
+ return s, err
}
// TemplateResult represents the result of a Template operation.