func()

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
}