+7
-7
atproto/data/blob.go
+7
-7
atproto/data/blob.go
···
19
19
Size int64
20
20
}
21
21
22
-
type LegacyBlob struct {
22
+
type LegacyBlobSchema struct {
23
23
Cid string `json:"cid" cborgen:"cid"`
24
24
MimeType string `json:"mimeType" cborgen:"mimeType"`
25
25
}
···
33
33
34
34
func (b Blob) MarshalJSON() ([]byte, error) {
35
35
if b.Size < 0 {
36
-
lb := LegacyBlob{
36
+
lb := LegacyBlobSchema{
37
37
Cid: b.Ref.String(),
38
38
MimeType: b.MimeType,
39
39
}
···
50
50
}
51
51
52
52
func (b *Blob) UnmarshalJSON(raw []byte) error {
53
-
typ, err := TypeExtract(raw)
53
+
typ, err := ExtractTypeJSON(raw)
54
54
if err != nil {
55
55
return fmt.Errorf("parsing blob type: %v", err)
56
56
}
···
68
68
return fmt.Errorf("parsing blob: negative size: %d", bs.Size)
69
69
}
70
70
} else {
71
-
var legacy LegacyBlob
71
+
var legacy LegacyBlobSchema
72
72
err := json.Unmarshal(raw, &legacy)
73
73
if err != nil {
74
74
return fmt.Errorf("parsing legacy blob: %v", err)
···
90
90
return err
91
91
}
92
92
if b.Size < 0 {
93
-
lb := LegacyBlob{
93
+
lb := LegacyBlobSchema{
94
94
Cid: b.Ref.String(),
95
95
MimeType: b.MimeType,
96
96
}
···
107
107
}
108
108
109
109
func (lb *Blob) UnmarshalCBOR(r io.Reader) error {
110
-
typ, b, err := CborTypeExtractReader(r)
110
+
typ, b, err := ExtractTypeCBORReader(r)
111
111
if err != nil {
112
112
return fmt.Errorf("parsing $blob CBOR type: %w", err)
113
113
}
···
126
126
return fmt.Errorf("parsing $blob CBOR: negative size: %d", bs.Size)
127
127
}
128
128
} else {
129
-
legacy := LegacyBlob{}
129
+
legacy := LegacyBlobSchema{}
130
130
err := legacy.UnmarshalCBOR(bytes.NewReader(b))
131
131
if err != nil {
132
132
return fmt.Errorf("parsing legacy blob CBOR: %v", err)
+10
-10
atproto/data/cbor_gen.go
+10
-10
atproto/data/cbor_gen.go
···
18
18
var _ = math.E
19
19
var _ = sort.Sort
20
20
21
-
func (t *CborChecker) MarshalCBOR(w io.Writer) error {
21
+
func (t *GenericRecord) MarshalCBOR(w io.Writer) error {
22
22
if t == nil {
23
23
_, err := w.Write(cbg.CborNull)
24
24
return err
···
55
55
return nil
56
56
}
57
57
58
-
func (t *CborChecker) UnmarshalCBOR(r io.Reader) (err error) {
59
-
*t = CborChecker{}
58
+
func (t *GenericRecord) UnmarshalCBOR(r io.Reader) (err error) {
59
+
*t = GenericRecord{}
60
60
61
61
cr := cbg.NewCborReader(r)
62
62
···
75
75
}
76
76
77
77
if extra > cbg.MaxLength {
78
-
return fmt.Errorf("CborChecker: map struct too large (%d)", extra)
78
+
return fmt.Errorf("GenericRecord: map struct too large (%d)", extra)
79
79
}
80
80
81
81
var name string
···
113
113
114
114
return nil
115
115
}
116
-
func (t *LegacyBlob) MarshalCBOR(w io.Writer) error {
116
+
func (t *LegacyBlobSchema) MarshalCBOR(w io.Writer) error {
117
117
if t == nil {
118
118
_, err := w.Write(cbg.CborNull)
119
119
return err
···
173
173
return nil
174
174
}
175
175
176
-
func (t *LegacyBlob) UnmarshalCBOR(r io.Reader) (err error) {
177
-
*t = LegacyBlob{}
176
+
func (t *LegacyBlobSchema) UnmarshalCBOR(r io.Reader) (err error) {
177
+
*t = LegacyBlobSchema{}
178
178
179
179
cr := cbg.NewCborReader(r)
180
180
···
193
193
}
194
194
195
195
if extra > cbg.MaxLength {
196
-
return fmt.Errorf("LegacyBlob: map struct too large (%d)", extra)
196
+
return fmt.Errorf("LegacyBlobSchema: map struct too large (%d)", extra)
197
197
}
198
198
199
199
var name string
···
254
254
return err
255
255
}
256
256
257
-
// t.Ref (util.LexLink) (struct)
257
+
// t.Ref (data.CIDLink) (struct)
258
258
if len("ref") > cbg.MaxLength {
259
259
return xerrors.Errorf("Value in field \"ref\" was too long")
260
260
}
···
374
374
}
375
375
376
376
switch name {
377
-
// t.Ref (util.LexLink) (struct)
377
+
// t.Ref (data.CIDLink) (struct)
378
378
case "ref":
379
379
380
380
{
+19
-17
atproto/data/extract.go
+19
-17
atproto/data/extract.go
···
7
7
"io"
8
8
)
9
9
10
-
type typeExtractor struct {
10
+
// Helper type for extracting record $type from CBOR
11
+
type GenericRecord struct {
11
12
Type string `json:"$type" cborgen:"$type"`
12
13
}
13
14
14
-
func TypeExtract(b []byte) (string, error) {
15
-
var te typeExtractor
16
-
if err := json.Unmarshal(b, &te); err != nil {
15
+
// Parses the top-level $type field from generic atproto JSON data
16
+
func ExtractTypeJSON(b []byte) (string, error) {
17
+
var gr GenericRecord
18
+
if err := json.Unmarshal(b, &gr); err != nil {
17
19
return "", err
18
20
}
19
21
20
-
return te.Type, nil
22
+
return gr.Type, nil
21
23
}
22
24
23
-
type CborChecker struct {
24
-
Type string `json:"$type" cborgen:"$type"`
25
-
}
26
-
27
-
func CborTypeExtract(b []byte) (string, error) {
28
-
var tcheck CborChecker
29
-
if err := tcheck.UnmarshalCBOR(bytes.NewReader(b)); err != nil {
25
+
// Parses the top-level $type field from generic atproto CBOR data
26
+
func ExtractTypeCBOR(b []byte) (string, error) {
27
+
var gr GenericRecord
28
+
if err := gr.UnmarshalCBOR(bytes.NewReader(b)); err != nil {
30
29
fmt.Printf("bad bytes: %x\n", b)
31
30
return "", err
32
31
}
33
32
34
-
return tcheck.Type, nil
33
+
return gr.Type, nil
35
34
}
36
35
37
-
func CborTypeExtractReader(r io.Reader) (string, []byte, error) {
36
+
// Parses top-level $type field from generic atproto CBOR.
37
+
//
38
+
// Returns that string field, and additional bytes (TODO: the parsed bytes, or remaining bytes?)
39
+
func ExtractTypeCBORReader(r io.Reader) (string, []byte, error) {
38
40
buf := new(bytes.Buffer)
39
41
tr := io.TeeReader(r, buf)
40
-
var tcheck CborChecker
41
-
if err := tcheck.UnmarshalCBOR(tr); err != nil {
42
+
var gr GenericRecord
43
+
if err := gr.UnmarshalCBOR(tr); err != nil {
42
44
return "", nil, err
43
45
}
44
46
45
-
return tcheck.Type, buf.Bytes(), nil
47
+
return gr.Type, buf.Bytes(), nil
46
48
}
+6
gen/main.go
+6
gen/main.go
···
11
11
lexutil "github.com/bluesky-social/indigo/lex/util"
12
12
"github.com/bluesky-social/indigo/mst"
13
13
"github.com/bluesky-social/indigo/repo"
14
+
"github.com/bluesky-social/indigo/atproto/data"
15
+
14
16
cbg "github.com/whyrusleeping/cbor-gen"
15
17
)
16
18
···
79
81
}
80
82
81
83
if err := cbg.WriteMapEncodersToFile("events/cbor_gen.go", "events", events.EventHeader{}, events.ErrorFrame{}); err != nil {
84
+
panic(err)
85
+
}
86
+
87
+
if err := cbg.WriteMapEncodersToFile("atproto/data/cbor_gen.go", "data", data.GenericRecord{}, data.LegacyBlobSchema{}, data.BlobSchema{}); err != nil {
82
88
panic(err)
83
89
}
84
90
}