1package gophercloud
2
3/*
4AuthResult is the result from the request that was used to obtain a provider
5client's Keystone token. It is returned from ProviderClient.GetAuthResult().
6
7The following types satisfy this interface:
8
9	github.com/gophercloud/gophercloud/openstack/identity/v2/tokens.CreateResult
10	github.com/gophercloud/gophercloud/openstack/identity/v3/tokens.CreateResult
11
12Usage example:
13
14	import (
15		"github.com/gophercloud/gophercloud"
16		tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens"
17		tokens3 "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens"
18	)
19
20	func GetAuthenticatedUserID(providerClient *gophercloud.ProviderClient) (string, error) {
21		r := providerClient.GetAuthResult()
22		if r == nil {
23			//ProviderClient did not use openstack.Authenticate(), e.g. because token
24			//was set manually with ProviderClient.SetToken()
25			return "", errors.New("no AuthResult available")
26		}
27		switch r := r.(type) {
28		case tokens2.CreateResult:
29			u, err := r.ExtractUser()
30			if err != nil {
31				return "", err
32			}
33			return u.ID, nil
34		case tokens3.CreateResult:
35			u, err := r.ExtractUser()
36			if err != nil {
37				return "", err
38			}
39			return u.ID, nil
40		default:
41			panic(fmt.Sprintf("got unexpected AuthResult type %t", r))
42		}
43	}
44
45Both implementing types share a lot of methods by name, like ExtractUser() in
46this example. But those methods cannot be part of the AuthResult interface
47because the return types are different (in this case, type tokens2.User vs.
48type tokens3.User).
49*/
50type AuthResult interface {
51	ExtractTokenID() (string, error)
52}
53