返回 DeepSeek-Reasonix
session_migration_nested_json.go
根目录 / desktop / session_migration_nested_json.go
1 package main
2
3 import "encoding/json"
4
5 func migrationNestedUnknown(body []byte, known ...string) (map[string]json.RawMessage, error) {
6 var fields map[string]json.RawMessage
7 if err := json.Unmarshal(body, &fields); err != nil {
8 return nil, err
9 }
10 for _, key := range known {
11 delete(fields, key)
12 }
13 return fields, nil
14 }
15 func migrationNestedMerge(value any, extra map[string]json.RawMessage) ([]byte, error) {
16 body, err := json.Marshal(value)
17 if err != nil {
18 return nil, err
19 }
20 var fields map[string]json.RawMessage
21 if err := json.Unmarshal(body, &fields); err != nil {
22 return nil, err
23 }
24 for key, value := range extra {
25 if _, ok := fields[key]; !ok {
26 fields[key] = value
27 }
28 }
29 return json.Marshal(fields)
30 }
31 func (v *desktopMigrationReceipt) UnmarshalJSON(body []byte) error {
32 type plain desktopMigrationReceipt
33 var out plain
34 if err := json.Unmarshal(body, &out); err != nil {
35 return err
36 }
37 extra, err := migrationNestedUnknown(body, "targetSessionId", "contentDigest", "sourceRevision")
38 *v = desktopMigrationReceipt(out)
39 v.extra = extra
40 return err
41 }
42 func (v desktopMigrationReceipt) MarshalJSON() ([]byte, error) {
43 type plain desktopMigrationReceipt
44 return migrationNestedMerge(plain(v), v.extra)
45 }
46 func (v *desktopMigrationConversion) UnmarshalJSON(body []byte) error {
47 type plain desktopMigrationConversion
48 var out plain
49 if err := json.Unmarshal(body, &out); err != nil {
50 return err
51 }
52 extra, err := migrationNestedUnknown(body, "root", "sessionId", "headId", "legacyDir", "codec", "depth")
53 *v = desktopMigrationConversion(out)
54 v.extra = extra
55 return err
56 }
57 func (v desktopMigrationConversion) MarshalJSON() ([]byte, error) {
58 type plain desktopMigrationConversion
59 return migrationNestedMerge(plain(v), v.extra)
60 }
61
61 lines GO