in datahub/resultmodel.go [404:462]
func (grr *GetRecordsResult) UnmarshalJSON(data []byte) error {
msg := &struct {
NextCursor string `json:"NextCursor"`
RecordCount int `json:"RecordCount"`
StartSequence int64 `json:"StartSeq"`
LatestSequence int64 `json:"LatestSeq"`
LatestTime int64 `json:"LatestTime"`
Records []*struct {
SystemTime int64 `json:"SystemTime"`
NextCursor string `json:"NextCursor"`
CurrentCursor string `json:"Cursor"`
Sequence int64 `json:"Sequence"`
Attributes map[string]interface{} `json:"Attributes"`
Data interface{} `json:"Data"`
} `json:"Records"`
}{}
err := json.Unmarshal(data, msg)
if err != nil {
return err
}
grr.NextCursor = msg.NextCursor
grr.RecordCount = msg.RecordCount
grr.StartSequence = msg.StartSequence
grr.LatestSequence = msg.LatestSequence
grr.LatestTime = msg.LatestTime
grr.Records = make([]IRecord, len(msg.Records))
for idx, record := range msg.Records {
if record.Data == nil {
return fmt.Errorf("invalid record response, record data is nil")
}
switch dt := record.Data.(type) {
case []interface{}, []string:
if grr.RecordSchema == nil {
return fmt.Errorf("tuple record type must set record schema")
}
grr.Records[idx] = NewTupleRecord(grr.RecordSchema, record.SystemTime)
case string:
grr.Records[idx] = NewBlobRecord([]byte(dt), record.SystemTime)
default:
return fmt.Errorf("illegal record data type[%T]", dt)
}
if err := grr.Records[idx].FillData(record.Data); err != nil {
return err
}
for key, val := range record.Attributes {
grr.Records[idx].SetAttribute(key, val)
}
br := BaseRecord{
SystemTime: msg.Records[idx].SystemTime,
NextCursor: msg.Records[idx].NextCursor,
Cursor: msg.Records[idx].CurrentCursor,
Sequence: msg.Records[idx].Sequence,
Attributes: msg.Records[idx].Attributes,
}
grr.Records[idx].SetBaseRecord(br)
}
return nil
}