| package users | 
 |  | 
 | import ( | 
 | 	"strconv" | 
 |  | 
 | 	os "github.com/rackspace/gophercloud/openstack/identity/v2/users" | 
 |  | 
 | 	"github.com/mitchellh/mapstructure" | 
 | ) | 
 |  | 
 | // User represents a user resource that exists on the API. | 
 | type User struct { | 
 | 	// The UUID for this user. | 
 | 	ID string | 
 |  | 
 | 	// The human name for this user. | 
 | 	Name string | 
 |  | 
 | 	// The username for this user. | 
 | 	Username string | 
 |  | 
 | 	// Indicates whether the user is enabled (true) or disabled (false). | 
 | 	Enabled bool | 
 |  | 
 | 	// The email address for this user. | 
 | 	Email string | 
 |  | 
 | 	// The ID of the tenant to which this user belongs. | 
 | 	TenantID string `mapstructure:"tenant_id"` | 
 |  | 
 | 	// Specifies the default region for the user account. This value is inherited | 
 | 	// from the user administrator when the account is created. | 
 | 	DefaultRegion string `mapstructure:"RAX-AUTH:defaultRegion"` | 
 |  | 
 | 	// Identifies the domain that contains the user account. This value is | 
 | 	// inherited from the user administrator when the account is created. | 
 | 	DomainID string `mapstructure:"RAX-AUTH:domainId"` | 
 |  | 
 | 	// The password value that the user needs for authentication. If the Add user | 
 | 	// request included a password value, this attribute is not included in the | 
 | 	// response. | 
 | 	Password string `mapstructure:"OS-KSADM:password"` | 
 |  | 
 | 	// Indicates whether the user has enabled multi-factor authentication. | 
 | 	MultiFactorEnabled bool `mapstructure:"RAX-AUTH:multiFactorEnabled"` | 
 | } | 
 |  | 
 | // CreateResult represents the result of a Create operation | 
 | type CreateResult struct { | 
 | 	os.CreateResult | 
 | } | 
 |  | 
 | // GetResult represents the result of a Get operation | 
 | type GetResult struct { | 
 | 	os.GetResult | 
 | } | 
 |  | 
 | // UpdateResult represents the result of an Update operation | 
 | type UpdateResult struct { | 
 | 	os.UpdateResult | 
 | } | 
 |  | 
 | func commonExtract(resp interface{}, err error) (*User, error) { | 
 | 	if err != nil { | 
 | 		return nil, err | 
 | 	} | 
 |  | 
 | 	var respStruct struct { | 
 | 		User *User `json:"user"` | 
 | 	} | 
 |  | 
 | 	// Since the API returns a string instead of a bool, we need to hack the JSON | 
 | 	json := resp.(map[string]interface{}) | 
 | 	user := json["user"].(map[string]interface{}) | 
 | 	if s, ok := user["RAX-AUTH:multiFactorEnabled"].(string); ok && s != "" { | 
 | 		if b, err := strconv.ParseBool(s); err == nil { | 
 | 			user["RAX-AUTH:multiFactorEnabled"] = b | 
 | 		} | 
 | 	} | 
 |  | 
 | 	err = mapstructure.Decode(json, &respStruct) | 
 |  | 
 | 	return respStruct.User, err | 
 | } | 
 |  | 
 | // Extract will get the Snapshot object out of the GetResult object. | 
 | func (r GetResult) Extract() (*User, error) { | 
 | 	return commonExtract(r.Body, r.Err) | 
 | } | 
 |  | 
 | // Extract will get the Snapshot object out of the CreateResult object. | 
 | func (r CreateResult) Extract() (*User, error) { | 
 | 	return commonExtract(r.Body, r.Err) | 
 | } | 
 |  | 
 | // Extract will get the Snapshot object out of the UpdateResult object. | 
 | func (r UpdateResult) Extract() (*User, error) { | 
 | 	return commonExtract(r.Body, r.Err) | 
 | } |