go.mercari.io/datastore@v1.8.2/clouddatastore/convert.go (about)

     1  package clouddatastore
     2  
     3  import (
     4  	"cloud.google.com/go/datastore"
     5  	w "go.mercari.io/datastore"
     6  )
     7  
     8  func toOriginalKey(key w.Key) *datastore.Key {
     9  	if key == nil {
    10  		return nil
    11  	}
    12  
    13  	return &datastore.Key{
    14  		Kind:      key.Kind(),
    15  		ID:        key.ID(),
    16  		Name:      key.Name(),
    17  		Parent:    toOriginalKey(key.ParentKey()),
    18  		Namespace: key.Namespace(),
    19  	}
    20  }
    21  
    22  func toOriginalKeys(keys []w.Key) []*datastore.Key {
    23  	if keys == nil {
    24  		return nil
    25  	}
    26  
    27  	origKeys := make([]*datastore.Key, len(keys))
    28  	for idx, key := range keys {
    29  		origKeys[idx] = toOriginalKey(key)
    30  	}
    31  
    32  	return origKeys
    33  }
    34  
    35  func toWrapperKey(key *datastore.Key) *keyImpl {
    36  	if key == nil {
    37  		return nil
    38  	}
    39  
    40  	return &keyImpl{
    41  		kind:      key.Kind,
    42  		id:        key.ID,
    43  		name:      key.Name,
    44  		parent:    toWrapperKey(key.Parent),
    45  		namespace: key.Namespace,
    46  	}
    47  }
    48  
    49  func toOriginalPendingKey(pKey w.PendingKey) *datastore.PendingKey {
    50  	if pKey == nil {
    51  		return nil
    52  	}
    53  	pk, ok := pKey.StoredContext().Value(contextPendingKey{}).(*pendingKeyImpl)
    54  	if !ok {
    55  		return nil
    56  	}
    57  
    58  	if pk == nil || pk.pendingKey == nil {
    59  		return nil
    60  	}
    61  
    62  	return pk.pendingKey
    63  }
    64  
    65  func toWrapperKeys(keys []*datastore.Key) []w.Key {
    66  	if keys == nil {
    67  		return nil
    68  	}
    69  
    70  	wKeys := make([]w.Key, len(keys))
    71  	for idx, key := range keys {
    72  		wKeys[idx] = toWrapperKey(key)
    73  	}
    74  
    75  	return wKeys
    76  }
    77  
    78  func toWrapperPendingKey(pendingKey *datastore.PendingKey) *pendingKeyImpl {
    79  	if pendingKey == nil {
    80  		return nil
    81  	}
    82  
    83  	return &pendingKeyImpl{
    84  		pendingKey: pendingKey,
    85  	}
    86  }
    87  
    88  func toWrapperPendingKeys(keys []*datastore.PendingKey) []w.PendingKey {
    89  	if keys == nil {
    90  		return nil
    91  	}
    92  
    93  	wKeys := make([]w.PendingKey, len(keys))
    94  	for idx, key := range keys {
    95  		wKeys[idx] = toWrapperPendingKey(key)
    96  	}
    97  
    98  	return wKeys
    99  }
   100  
   101  func toWrapperError(err error) error {
   102  	if err == nil {
   103  		return nil
   104  	}
   105  
   106  	switch {
   107  	case err == datastore.ErrNoSuchEntity:
   108  		return w.ErrNoSuchEntity
   109  
   110  	case err == datastore.ErrConcurrentTransaction:
   111  		return w.ErrConcurrentTransaction
   112  
   113  	case err == datastore.ErrInvalidEntityType:
   114  		return w.ErrInvalidEntityType
   115  
   116  	case err == datastore.ErrInvalidKey:
   117  		return w.ErrInvalidKey
   118  
   119  	default:
   120  		switch err := err.(type) {
   121  		case *datastore.ErrFieldMismatch:
   122  			return &w.ErrFieldMismatch{
   123  				StructType: err.StructType,
   124  				FieldName:  err.FieldName,
   125  				Reason:     err.Reason,
   126  			}
   127  
   128  		case datastore.MultiError:
   129  			merr := err
   130  			newErr := make(w.MultiError, 0, len(merr))
   131  			for _, err := range merr {
   132  				if err != nil {
   133  					newErr = append(newErr, toWrapperError(err))
   134  					continue
   135  				}
   136  
   137  				newErr = append(newErr, nil)
   138  			}
   139  			return newErr
   140  		}
   141  
   142  		return err
   143  	}
   144  }
   145  
   146  func toOriginalEntity(entity *w.Entity) *datastore.Entity {
   147  	if entity == nil {
   148  		return nil
   149  	}
   150  
   151  	return &datastore.Entity{
   152  		Key:        toOriginalKey(entity.Key),
   153  		Properties: toOriginalPropertyList(entity.Properties),
   154  	}
   155  }
   156  
   157  func toOriginalValue(v interface{}) interface{} {
   158  	switch v := v.(type) {
   159  	case []interface{}:
   160  		vs := v
   161  		origVs := make([]interface{}, 0, len(v))
   162  		for _, v := range vs {
   163  			origVs = append(origVs, toOriginalValue(v))
   164  		}
   165  		return origVs
   166  
   167  	case *w.Entity:
   168  		return toOriginalEntity(v)
   169  	case []*w.Entity:
   170  		vs := v
   171  		origVs := make([]*datastore.Entity, 0, len(v))
   172  		for _, v := range vs {
   173  			origVs = append(origVs, toOriginalValue(v).(*datastore.Entity))
   174  		}
   175  		return origVs
   176  
   177  	case w.Key:
   178  		return toOriginalKey(v)
   179  	case []w.Key:
   180  		return toOriginalKeys(v)
   181  
   182  	case w.GeoPoint:
   183  		return datastore.GeoPoint{Lat: v.Lat, Lng: v.Lng}
   184  	case []w.GeoPoint:
   185  		vs := v
   186  		origVs := make([]datastore.GeoPoint, 0, len(v))
   187  		for _, v := range vs {
   188  			origVs = append(origVs, toOriginalValue(v).(datastore.GeoPoint))
   189  		}
   190  		return origVs
   191  
   192  	default:
   193  		return v
   194  	}
   195  }
   196  
   197  func toWrapperValue(v interface{}) interface{} {
   198  	switch v := v.(type) {
   199  	case []interface{}:
   200  		vs := v
   201  		wVs := make([]interface{}, 0, len(v))
   202  		for _, v := range vs {
   203  			wVs = append(wVs, toWrapperValue(v))
   204  		}
   205  		return wVs
   206  
   207  	case *datastore.Entity:
   208  		if v == nil {
   209  			return nil
   210  		}
   211  		return toWrapperEntity(v)
   212  	case []*datastore.Entity:
   213  		vs := v
   214  		wVs := make([]*w.Entity, 0, len(v))
   215  		for _, v := range vs {
   216  			wVs = append(wVs, toWrapperValue(v).(*w.Entity))
   217  		}
   218  		return wVs
   219  
   220  	case *datastore.Key:
   221  		return toWrapperKey(v)
   222  	case []*datastore.Key:
   223  		return toWrapperKeys(v)
   224  
   225  	case datastore.GeoPoint:
   226  		return w.GeoPoint{Lat: v.Lat, Lng: v.Lng}
   227  	case []datastore.GeoPoint:
   228  		vs := v
   229  		wVs := make([]w.GeoPoint, 0, len(v))
   230  		for _, v := range vs {
   231  			wVs = append(wVs, toWrapperValue(v).(w.GeoPoint))
   232  		}
   233  		return wVs
   234  
   235  	default:
   236  		return v
   237  	}
   238  }
   239  
   240  func toOriginalProperty(p w.Property) datastore.Property {
   241  	return datastore.Property{
   242  		Name:    p.Name,
   243  		Value:   toOriginalValue(p.Value),
   244  		NoIndex: p.NoIndex,
   245  	}
   246  }
   247  
   248  func toOriginalPropertyList(ps w.PropertyList) datastore.PropertyList {
   249  	if ps == nil {
   250  		return nil
   251  	}
   252  
   253  	newPs := make([]datastore.Property, 0, len(ps))
   254  	for _, p := range ps {
   255  		newPs = append(newPs, toOriginalProperty(p))
   256  	}
   257  
   258  	return newPs
   259  }
   260  
   261  func toOriginalPropertyListList(pss []w.PropertyList) []datastore.PropertyList {
   262  	if pss == nil {
   263  		return nil
   264  	}
   265  
   266  	newPss := make([]datastore.PropertyList, 0, len(pss))
   267  	for _, ps := range pss {
   268  		newPss = append(newPss, toOriginalPropertyList(ps))
   269  	}
   270  
   271  	return newPss
   272  }
   273  
   274  func toWrapperEntity(entity *datastore.Entity) *w.Entity {
   275  	if entity == nil {
   276  		return nil
   277  	}
   278  
   279  	wrapperEntity := &w.Entity{
   280  		Properties: toWrapperPropertyList(entity.Properties),
   281  	}
   282  	if entity.Key == nil {
   283  		wrapperEntity.Key = nil
   284  	} else {
   285  		wrapperEntity.Key = toWrapperKey(entity.Key)
   286  	}
   287  	return wrapperEntity
   288  }
   289  
   290  func toWrapperProperty(p datastore.Property) w.Property {
   291  	return w.Property{
   292  		Name:    p.Name,
   293  		Value:   toWrapperValue(p.Value),
   294  		NoIndex: p.NoIndex,
   295  	}
   296  }
   297  
   298  func toWrapperPropertyList(ps datastore.PropertyList) w.PropertyList {
   299  	if ps == nil {
   300  		return nil
   301  	}
   302  
   303  	newPs := make([]w.Property, 0, len(ps))
   304  	for _, p := range ps {
   305  		newPs = append(newPs, toWrapperProperty(p))
   306  	}
   307  
   308  	return newPs
   309  }
   310  
   311  func toWrapperPropertyListList(pss []datastore.PropertyList) []w.PropertyList {
   312  	if pss == nil {
   313  		return nil
   314  	}
   315  
   316  	newPss := make([]w.PropertyList, 0, len(pss))
   317  	for _, ps := range pss {
   318  		newPss = append(newPss, toWrapperPropertyList(ps))
   319  	}
   320  
   321  	return newPss
   322  }
   323  
   324  func toOriginalTransaction(tx w.Transaction) *datastore.Transaction {
   325  	baseTx := getTx(tx.(*transactionImpl).client.ctx)
   326  	if tx == nil {
   327  		panic("not in transaction")
   328  	}
   329  
   330  	return baseTx
   331  }