github.com/altipla-consulting/ravendb-go-client@v0.1.3/generate_entity_id_on_the_client.go (about)

     1  package ravendb
     2  
     3  import "strings"
     4  
     5  type genIDFunc func(interface{}) (string, error)
     6  
     7  type generateEntityIDOnTheClient struct {
     8  	_conventions *DocumentConventions
     9  	_generateID  genIDFunc
    10  }
    11  
    12  func newGenerateEntityIDOnTheClient(conventions *DocumentConventions, generateID genIDFunc) *generateEntityIDOnTheClient {
    13  	return &generateEntityIDOnTheClient{
    14  		_conventions: conventions,
    15  		_generateID:  generateID,
    16  	}
    17  }
    18  
    19  // Attempts to get the document key from an instance
    20  func (g *generateEntityIDOnTheClient) tryGetIDFromInstance(entity interface{}) (string, bool) {
    21  	panicIf(entity == nil, "Entity cannot be null")
    22  	return tryGetIDFromInstance(entity)
    23  }
    24  
    25  // Tries to get the identity.
    26  func (g *generateEntityIDOnTheClient) getOrGenerateDocumentID(entity interface{}) (string, error) {
    27  	var err error
    28  	id, ok := g.tryGetIDFromInstance(entity)
    29  	if !ok || id == "" {
    30  		id, err = g._generateID(entity)
    31  		if err != nil {
    32  			return "", err
    33  		}
    34  	}
    35  
    36  	if strings.HasPrefix(id, "/") {
    37  		return "", newIllegalStateError("Cannot use value '" + id + "' as a document id because it begins with a '/'")
    38  	}
    39  	return id, nil
    40  }
    41  
    42  func (g *generateEntityIDOnTheClient) generateDocumentKeyForStorage(entity interface{}) (string, error) {
    43  	id, err := g.getOrGenerateDocumentID(entity)
    44  	if err != nil {
    45  		return "", err
    46  	}
    47  	g.trySetIdentity(entity, id)
    48  	return id, nil
    49  }
    50  
    51  // Tries to set the identity property
    52  func (g *generateEntityIDOnTheClient) trySetIdentity(entity interface{}, id string) {
    53  	trySetIDOnEntity(entity, id)
    54  }