]>
Commit | Line | Data |
---|---|---|
1 | // +build appengine | |
2 | ||
3 | package msgpack | |
4 | ||
5 | import ( | |
6 | "reflect" | |
7 | ||
8 | ds "google.golang.org/appengine/datastore" | |
9 | ) | |
10 | ||
11 | func init() { | |
12 | Register((*ds.Key)(nil), encodeDatastoreKeyValue, decodeDatastoreKeyValue) | |
13 | Register((*ds.Cursor)(nil), encodeDatastoreCursorValue, decodeDatastoreCursorValue) | |
14 | } | |
15 | ||
16 | func EncodeDatastoreKey(e *Encoder, key *ds.Key) error { | |
17 | if key == nil { | |
18 | return e.EncodeNil() | |
19 | } | |
20 | return e.EncodeString(key.Encode()) | |
21 | } | |
22 | ||
23 | func encodeDatastoreKeyValue(e *Encoder, v reflect.Value) error { | |
24 | key := v.Interface().(*ds.Key) | |
25 | return EncodeDatastoreKey(e, key) | |
26 | } | |
27 | ||
28 | func DecodeDatastoreKey(d *Decoder) (*ds.Key, error) { | |
29 | v, err := d.DecodeString() | |
30 | if err != nil { | |
31 | return nil, err | |
32 | } | |
33 | if v == "" { | |
34 | return nil, nil | |
35 | } | |
36 | return ds.DecodeKey(v) | |
37 | } | |
38 | ||
39 | func decodeDatastoreKeyValue(d *Decoder, v reflect.Value) error { | |
40 | key, err := DecodeDatastoreKey(d) | |
41 | if err != nil { | |
42 | return err | |
43 | } | |
44 | v.Set(reflect.ValueOf(key)) | |
45 | return nil | |
46 | } | |
47 | ||
48 | func encodeDatastoreCursorValue(e *Encoder, v reflect.Value) error { | |
49 | cursor := v.Interface().(ds.Cursor) | |
50 | return e.Encode(cursor.String()) | |
51 | } | |
52 | ||
53 | func decodeDatastoreCursorValue(d *Decoder, v reflect.Value) error { | |
54 | s, err := d.DecodeString() | |
55 | if err != nil { | |
56 | return err | |
57 | } | |
58 | cursor, err := ds.DecodeCursor(s) | |
59 | if err != nil { | |
60 | return err | |
61 | } | |
62 | v.Set(reflect.ValueOf(cursor)) | |
63 | return nil | |
64 | } |