// writeIndexValue writes the index value of v to buf. // // v may be one of the return types from ds.Property's GetIndexTypeAndValue // method. func writeIndexValue(buf Buffer, context KeyContext, v interface{}) (err error) { switch t := v.(type) { case nil: case bool: b := byte(0) if t { b = 1 } err = buf.WriteByte(b) case int64: _, err = cmpbin.WriteInt(buf, t) case float64: _, err = cmpbin.WriteFloat64(buf, t) case string: _, err = cmpbin.WriteString(buf, t) case []byte: _, err = cmpbin.WriteBytes(buf, t) case ds.GeoPoint: err = WriteGeoPoint(buf, t) case *ds.Key: err = WriteKey(buf, context, t) default: err = fmt.Errorf("unsupported type: %T", t) } return }
// WriteProperty writes a Property to the buffer. `context` behaves the same // way that it does for WriteKey, but only has an effect if `p` contains a // Key as its Value. func WriteProperty(buf Buffer, context KeyContext, p ds.Property) (err error) { defer recoverTo(&err) typb := byte(p.Type()) if p.IndexSetting() != ds.NoIndex { typb |= 0x80 } panicIf(buf.WriteByte(typb)) switch p.Type() { case ds.PTNull: case ds.PTBool: b := p.Value().(bool) if b { err = buf.WriteByte(1) } else { err = buf.WriteByte(0) } case ds.PTInt: _, err = cmpbin.WriteInt(buf, p.Value().(int64)) case ds.PTFloat: _, err = cmpbin.WriteFloat64(buf, p.Value().(float64)) case ds.PTString: _, err = cmpbin.WriteString(buf, p.Value().(string)) case ds.PTBytes: _, err = cmpbin.WriteBytes(buf, p.Value().([]byte)) case ds.PTTime: err = WriteTime(buf, p.Value().(time.Time)) case ds.PTGeoPoint: err = WriteGeoPoint(buf, p.Value().(ds.GeoPoint)) case ds.PTKey: err = WriteKey(buf, context, p.Value().(ds.Key)) case ds.PTBlobKey: _, err = cmpbin.WriteString(buf, string(p.Value().(blobstore.Key))) } return }