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  }