forked from vmware/go-vcloud-director
/
entity.go
71 lines (62 loc) · 2.14 KB
/
entity.go
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
/*
* Copyright 2019 VMware, Inc. All rights reserved. Licensed under the Apache v2 License.
*/
package govcd
type genericGetter func(string, bool) (interface{}, error)
// getEntityByNameOrId finds a generic entity by Name Or ID
// On success, returns an empty interface representing a pointer to the structure and a nil error
// On failure, returns a nil pointer and an error
// Example usage:
//
// func (org *Org) GetCatalogByNameOrId(identifier string, refresh bool) (*Catalog, error) {
// getByName := func(name string, refresh bool) (interface{}, error) {
// return org.GetCatalogByName(name, refresh)
// }
// getById := func(id string, refresh bool) (interface{}, error) {
// return org.GetCatalogById(id, refresh)
// }
// entity, err := getEntityByNameOrId(getByName, getById, identifier, refresh)
// if entity != nil {
// return nil, err
// }
// return entity.(*Catalog), err
// }
func getEntityByNameOrId(getByName, getById genericGetter, identifier string, refresh bool) (interface{}, error) {
var byNameErr, byIdErr error
var entity interface{}
entity, byIdErr = getById(identifier, refresh)
if byIdErr == nil {
// Found by ID
return entity, nil
}
if IsNotFound(byIdErr) {
// Not found by ID, try by name
entity, byNameErr = getByName(identifier, false)
return entity, byNameErr
} else {
// On any other error, we return it
return nil, byIdErr
}
}
// getEntityByNameOrIdSkipNonId is like getEntityByNameOrId, but it does not even attempt to lookup "ById" if the
// identifier does not look like URN or UUID
func getEntityByNameOrIdSkipNonId(getByName, getById genericGetter, identifier string, refresh bool) (interface{}, error) {
var byNameErr, byIdErr error
var entity interface{}
// Only check by Id if it is an ID or an URN
if isUrn(identifier) || IsUuid(identifier) {
entity, byIdErr = getById(identifier, refresh)
if byIdErr == nil {
// Found by ID
return entity, nil
}
}
if IsNotFound(byIdErr) || byIdErr == nil {
// Not found by ID, try by name
entity, byNameErr = getByName(identifier, false)
return entity, byNameErr
} else {
// On any other error, we return it
return nil, byIdErr
}
}