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 }