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 }