// parseIntoBSO takes JSON and turns into a syncstorage.PutBSOInput func parseIntoBSO(jsonData json.RawMessage, bso *syncstorage.PutBSOInput) *parseError { // make sure JSON BSO data *only* has the keys that are allowed var bkeys map[string]json.RawMessage err := json.Unmarshal(jsonData, &bkeys) if err != nil { return &parseError{field: "-", msg: "Could not parse into object"} } else { for k, _ := range bkeys { switch k { case "id", "payload", "ttl", "sortindex": // it's ok case "modified": // to pass the python test_meta_global_sanity functional test default: return &parseError{field: k, msg: "invalid field"} } } } var bId string // check to make sure values are appropriate if r, ok := bkeys["id"]; ok { err := json.Unmarshal(r, &bId) if err != nil { return &parseError{field: "id", msg: "Invalid format"} } else { bso.Id = bId } } if r, ok := bkeys["payload"]; ok { var payload string err := json.Unmarshal(r, &payload) if err != nil { return &parseError{bId: bId, field: "payload", msg: "Invalid format"} } else { bso.Payload = &payload } } if r, ok := bkeys["ttl"]; ok { var ttl int err := json.Unmarshal(r, &ttl) if err != nil { return &parseError{bId: bId, field: "ttl", msg: "Invalid format"} } else { bso.TTL = &ttl } } if r, ok := bkeys["sortindex"]; ok { var sortindex int err := json.Unmarshal(r, &sortindex) if err != nil { return &parseError{bId: bId, field: "sortindex", msg: "Invalid format"} } else { bso.SortIndex = &sortindex } } return nil }