fork of indigo with slightly nicer lexgen

data: rename some types, wire up cborgen

Changed files
+42 -34
atproto
gen
+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
··· 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
··· 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
··· 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 }