github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/entity.go (about) 1 /* 2 * Copyright 2019 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 3 */ 4 5 package govcd 6 7 type genericGetter func(string, bool) (interface{}, error) 8 9 // getEntityByNameOrId finds a generic entity by Name Or ID 10 // On success, returns an empty interface representing a pointer to the structure and a nil error 11 // On failure, returns a nil pointer and an error 12 // Example usage: 13 // 14 // func (org *Org) GetCatalogByNameOrId(identifier string, refresh bool) (*Catalog, error) { 15 // getByName := func(name string, refresh bool) (interface{}, error) { 16 // return org.GetCatalogByName(name, refresh) 17 // } 18 // getById := func(id string, refresh bool) (interface{}, error) { 19 // return org.GetCatalogById(id, refresh) 20 // } 21 // entity, err := getEntityByNameOrId(getByName, getById, identifier, refresh) 22 // if entity != nil { 23 // return nil, err 24 // } 25 // return entity.(*Catalog), err 26 // } 27 func getEntityByNameOrId(getByName, getById genericGetter, identifier string, refresh bool) (interface{}, error) { 28 29 var byNameErr, byIdErr error 30 var entity interface{} 31 32 entity, byIdErr = getById(identifier, refresh) 33 if byIdErr == nil { 34 // Found by ID 35 return entity, nil 36 } 37 if IsNotFound(byIdErr) { 38 // Not found by ID, try by name 39 entity, byNameErr = getByName(identifier, false) 40 return entity, byNameErr 41 } else { 42 // On any other error, we return it 43 return nil, byIdErr 44 } 45 } 46 47 // getEntityByNameOrIdSkipNonId is like getEntityByNameOrId, but it does not even attempt to lookup "ById" if the 48 // identifier does not look like URN or UUID 49 func getEntityByNameOrIdSkipNonId(getByName, getById genericGetter, identifier string, refresh bool) (interface{}, error) { 50 51 var byNameErr, byIdErr error 52 var entity interface{} 53 54 // Only check by Id if it is an ID or an URN 55 if isUrn(identifier) || IsUuid(identifier) { 56 entity, byIdErr = getById(identifier, refresh) 57 if byIdErr == nil { 58 // Found by ID 59 return entity, nil 60 } 61 } 62 63 if IsNotFound(byIdErr) || byIdErr == nil { 64 // Not found by ID, try by name 65 entity, byNameErr = getByName(identifier, false) 66 return entity, byNameErr 67 } else { 68 // On any other error, we return it 69 return nil, byIdErr 70 } 71 }