From f90921d35aa26eb47d35ad4a073db33e346eda48 Mon Sep 17 00:00:00 2001 From: Petra Jaros Date: Mon, 4 May 2026 16:58:13 -0400 Subject: [PATCH] feat: Add `/blob/list` --- capabilities/space/blob/datamodel/cbor_gen.go | 657 ++++++++++++++++++ capabilities/space/blob/datamodel/gen/main.go | 21 + capabilities/space/blob/datamodel/json_gen.go | 625 +++++++++++++++++ capabilities/space/blob/datamodel/list.go | 21 + capabilities/space/blob/list.go | 17 + 5 files changed, 1341 insertions(+) create mode 100644 capabilities/space/blob/datamodel/cbor_gen.go create mode 100644 capabilities/space/blob/datamodel/gen/main.go create mode 100644 capabilities/space/blob/datamodel/json_gen.go create mode 100644 capabilities/space/blob/datamodel/list.go create mode 100644 capabilities/space/blob/list.go diff --git a/capabilities/space/blob/datamodel/cbor_gen.go b/capabilities/space/blob/datamodel/cbor_gen.go new file mode 100644 index 0000000..114717c --- /dev/null +++ b/capabilities/space/blob/datamodel/cbor_gen.go @@ -0,0 +1,657 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package datamodel + +import ( + "fmt" + "io" + "math" + "sort" + + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +func (t *ListArgumentsModel) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + fieldCount := 2 + + if t.Cursor == nil { + fieldCount-- + } + + if t.Size == nil { + fieldCount-- + } + + if _, err := cw.Write(cbg.CborEncodeMajorType(cbg.MajMap, uint64(fieldCount))); err != nil { + return err + } + + // t.Size (uint64) (uint64) + if t.Size != nil { + + if len("size") > 8192 { + return xerrors.Errorf("Value in field \"size\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("size"))); err != nil { + return err + } + if _, err := cw.WriteString(string("size")); err != nil { + return err + } + + if t.Size == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(*t.Size)); err != nil { + return err + } + } + + } + + // t.Cursor (string) (string) + if t.Cursor != nil { + + if len("cursor") > 8192 { + return xerrors.Errorf("Value in field \"cursor\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("cursor"))); err != nil { + return err + } + if _, err := cw.WriteString(string("cursor")); err != nil { + return err + } + + if t.Cursor == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if len(*t.Cursor) > 8192 { + return xerrors.Errorf("Value in field t.Cursor was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(*t.Cursor))); err != nil { + return err + } + if _, err := cw.WriteString(string(*t.Cursor)); err != nil { + return err + } + } + } + return nil +} + +func (t *ListArgumentsModel) UnmarshalCBOR(r io.Reader) (err error) { + *t = ListArgumentsModel{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajMap { + return fmt.Errorf("cbor input should be of type map") + } + + if extra > cbg.MaxLength { + return fmt.Errorf("ListArgumentsModel: map struct too large (%d)", extra) + } + + n := extra + + nameBuf := make([]byte, 6) + for i := uint64(0); i < n; i++ { + nameLen, ok, err := cbg.ReadFullStringIntoBuf(cr, nameBuf, 8192) + if err != nil { + return err + } + + if !ok { + // Field doesn't exist on this type, so ignore it + if err := cbg.ScanForLinks(cr, func(cid.Cid) {}); err != nil { + return err + } + continue + } + + switch string(nameBuf[:nameLen]) { + // t.Size (uint64) (uint64) + case "size": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + typed := uint64(extra) + t.Size = &typed + } + + } + // t.Cursor (string) (string) + case "cursor": + + { + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.Cursor = (*string)(&sval) + } + } + + default: + // Field doesn't exist on this type, so ignore it + if err := cbg.ScanForLinks(r, func(cid.Cid) {}); err != nil { + return err + } + } + } + + return nil +} +func (t *ListOKModel) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + fieldCount := 5 + + if t.Cursor == nil { + fieldCount-- + } + + if t.Before == nil { + fieldCount-- + } + + if t.After == nil { + fieldCount-- + } + + if _, err := cw.Write(cbg.CborEncodeMajorType(cbg.MajMap, uint64(fieldCount))); err != nil { + return err + } + + // t.Size (uint64) (uint64) + if len("size") > 8192 { + return xerrors.Errorf("Value in field \"size\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("size"))); err != nil { + return err + } + if _, err := cw.WriteString(string("size")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Size)); err != nil { + return err + } + + // t.After (string) (string) + if t.After != nil { + + if len("after") > 8192 { + return xerrors.Errorf("Value in field \"after\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("after"))); err != nil { + return err + } + if _, err := cw.WriteString(string("after")); err != nil { + return err + } + + if t.After == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if len(*t.After) > 8192 { + return xerrors.Errorf("Value in field t.After was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(*t.After))); err != nil { + return err + } + if _, err := cw.WriteString(string(*t.After)); err != nil { + return err + } + } + } + + // t.Before (string) (string) + if t.Before != nil { + + if len("before") > 8192 { + return xerrors.Errorf("Value in field \"before\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("before"))); err != nil { + return err + } + if _, err := cw.WriteString(string("before")); err != nil { + return err + } + + if t.Before == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if len(*t.Before) > 8192 { + return xerrors.Errorf("Value in field t.Before was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(*t.Before))); err != nil { + return err + } + if _, err := cw.WriteString(string(*t.Before)); err != nil { + return err + } + } + } + + // t.Cursor (string) (string) + if t.Cursor != nil { + + if len("cursor") > 8192 { + return xerrors.Errorf("Value in field \"cursor\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("cursor"))); err != nil { + return err + } + if _, err := cw.WriteString(string("cursor")); err != nil { + return err + } + + if t.Cursor == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if len(*t.Cursor) > 8192 { + return xerrors.Errorf("Value in field t.Cursor was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(*t.Cursor))); err != nil { + return err + } + if _, err := cw.WriteString(string(*t.Cursor)); err != nil { + return err + } + } + } + + // t.Results ([]datamodel.ListBlobItem) (slice) + if len("results") > 8192 { + return xerrors.Errorf("Value in field \"results\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("results"))); err != nil { + return err + } + if _, err := cw.WriteString(string("results")); err != nil { + return err + } + + if len(t.Results) > 8192 { + return xerrors.Errorf("Slice value in field t.Results was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Results))); err != nil { + return err + } + for _, v := range t.Results { + if err := v.MarshalCBOR(cw); err != nil { + return err + } + + } + return nil +} + +func (t *ListOKModel) UnmarshalCBOR(r io.Reader) (err error) { + *t = ListOKModel{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajMap { + return fmt.Errorf("cbor input should be of type map") + } + + if extra > cbg.MaxLength { + return fmt.Errorf("ListOKModel: map struct too large (%d)", extra) + } + + n := extra + + nameBuf := make([]byte, 7) + for i := uint64(0); i < n; i++ { + nameLen, ok, err := cbg.ReadFullStringIntoBuf(cr, nameBuf, 8192) + if err != nil { + return err + } + + if !ok { + // Field doesn't exist on this type, so ignore it + if err := cbg.ScanForLinks(cr, func(cid.Cid) {}); err != nil { + return err + } + continue + } + + switch string(nameBuf[:nameLen]) { + // t.Size (uint64) (uint64) + case "size": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Size = uint64(extra) + + } + // t.After (string) (string) + case "after": + + { + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.After = (*string)(&sval) + } + } + // t.Before (string) (string) + case "before": + + { + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.Before = (*string)(&sval) + } + } + // t.Cursor (string) (string) + case "cursor": + + { + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.Cursor = (*string)(&sval) + } + } + // t.Results ([]datamodel.ListBlobItem) (slice) + case "results": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > 8192 { + return fmt.Errorf("t.Results: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Results = make([]ListBlobItem, extra) + } + + for i := 0; i < int(extra); i++ { + { + var maj byte + var extra uint64 + var err error + _ = maj + _ = extra + _ = err + + { + + if err := t.Results[i].UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Results[i]: %w", err) + } + + } + + } + } + + default: + // Field doesn't exist on this type, so ignore it + if err := cbg.ScanForLinks(r, func(cid.Cid) {}); err != nil { + return err + } + } + } + + return nil +} +func (t *ListBlobItem) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write([]byte{162}); err != nil { + return err + } + + // t.Blob (datamodel.BlobModel) (struct) + if len("blob") > 8192 { + return xerrors.Errorf("Value in field \"blob\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("blob"))); err != nil { + return err + } + if _, err := cw.WriteString(string("blob")); err != nil { + return err + } + + if err := t.Blob.MarshalCBOR(cw); err != nil { + return err + } + + // t.InsertedAt (uint64) (uint64) + if len("insertedAt") > 8192 { + return xerrors.Errorf("Value in field \"insertedAt\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("insertedAt"))); err != nil { + return err + } + if _, err := cw.WriteString(string("insertedAt")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.InsertedAt)); err != nil { + return err + } + + return nil +} + +func (t *ListBlobItem) UnmarshalCBOR(r io.Reader) (err error) { + *t = ListBlobItem{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajMap { + return fmt.Errorf("cbor input should be of type map") + } + + if extra > cbg.MaxLength { + return fmt.Errorf("ListBlobItem: map struct too large (%d)", extra) + } + + n := extra + + nameBuf := make([]byte, 10) + for i := uint64(0); i < n; i++ { + nameLen, ok, err := cbg.ReadFullStringIntoBuf(cr, nameBuf, 8192) + if err != nil { + return err + } + + if !ok { + // Field doesn't exist on this type, so ignore it + if err := cbg.ScanForLinks(cr, func(cid.Cid) {}); err != nil { + return err + } + continue + } + + switch string(nameBuf[:nameLen]) { + // t.Blob (datamodel.BlobModel) (struct) + case "blob": + + { + + if err := t.Blob.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Blob: %w", err) + } + + } + // t.InsertedAt (uint64) (uint64) + case "insertedAt": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.InsertedAt = uint64(extra) + + } + + default: + // Field doesn't exist on this type, so ignore it + if err := cbg.ScanForLinks(r, func(cid.Cid) {}); err != nil { + return err + } + } + } + + return nil +} diff --git a/capabilities/space/blob/datamodel/gen/main.go b/capabilities/space/blob/datamodel/gen/main.go new file mode 100644 index 0000000..6b65fd2 --- /dev/null +++ b/capabilities/space/blob/datamodel/gen/main.go @@ -0,0 +1,21 @@ +package main + +import ( + jsg "github.com/alanshaw/dag-json-gen" + sbdm "github.com/alanshaw/libracha/capabilities/space/blob/datamodel" + cbg "github.com/whyrusleeping/cbor-gen" +) + +func main() { + models := []any{ + sbdm.ListArgumentsModel{}, + sbdm.ListOKModel{}, + sbdm.ListBlobItem{}, + } + if err := cbg.WriteMapEncodersToFile("../cbor_gen.go", "datamodel", models...); err != nil { + panic(err) + } + if err := jsg.WriteMapEncodersToFile("../json_gen.go", "datamodel", models...); err != nil { + panic(err) + } +} diff --git a/capabilities/space/blob/datamodel/json_gen.go b/capabilities/space/blob/datamodel/json_gen.go new file mode 100644 index 0000000..5182029 --- /dev/null +++ b/capabilities/space/blob/datamodel/json_gen.go @@ -0,0 +1,625 @@ +// Code generated by github.com/alanshaw/dag-json-gen. DO NOT EDIT. + +package datamodel + +import ( + "errors" + "fmt" + "io" + "math" + "sort" + + jsg "github.com/alanshaw/dag-json-gen" + cid "github.com/ipfs/go-cid" +) + +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort +var _ = errors.Is + +func (t *ListArgumentsModel) MarshalDagJSON(w io.Writer) error { + jw := jsg.NewDagJsonWriter(w) + if t == nil { + err := jw.WriteNull() + return err + } + if err := jw.WriteObjectOpen(); err != nil { + return err + } + written := 0 + + // t.Cursor (string) (string) + if t.Cursor != nil { + if len("cursor") > 8192 { + return fmt.Errorf("String in field \"cursor\" was too long") + } + if err := jw.WriteString(string("cursor")); err != nil { + return fmt.Errorf("\"cursor\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + if t.Cursor == nil { + if err := jw.WriteNull(); err != nil { + return fmt.Errorf("t.Cursor: %w", err) + } + } else { + if len(*t.Cursor) > 8192 { + return fmt.Errorf("String in field t.Cursor was too long") + } + if err := jw.WriteString(string(*t.Cursor)); err != nil { + return fmt.Errorf("t.Cursor: %w", err) + } + } + written++ + } + if t.Size != nil { + if written > 0 { + if err := jw.WriteComma(); err != nil { + return err + } + } + } + + // t.Size (uint64) (uint64) + if t.Size != nil { + if len("size") > 8192 { + return fmt.Errorf("String in field \"size\" was too long") + } + if err := jw.WriteString(string("size")); err != nil { + return fmt.Errorf("\"size\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + + if t.Size == nil { + if err := jw.WriteNull(); err != nil { + return fmt.Errorf("t.Size: %w", err) + } + } else { + if err := jw.WriteUint64(uint64(*t.Size)); err != nil { + return fmt.Errorf("t.Size: %w", err) + } + } + + written++ + } + if err := jw.WriteObjectClose(); err != nil { + return err + } + return nil +} +func (t *ListArgumentsModel) UnmarshalDagJSON(r io.Reader) (err error) { + *t = ListArgumentsModel{} + + jr := jsg.NewDagJsonReader(r) + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + if err := jr.ReadObjectOpen(); err != nil { + return fmt.Errorf("ListArgumentsModel: %w", err) + } + close, err := jr.PeekObjectClose() + if err != nil { + return fmt.Errorf("ListArgumentsModel: %w", err) + } + if close { + if err := jr.ReadObjectClose(); err != nil { + return fmt.Errorf("ListArgumentsModel: %w", err) + } + } else { + for i := uint64(0); i < 8192; i++ { + name, err := jr.ReadString(8192) + if err != nil { + if errors.Is(err, jsg.ErrLimitExceeded) { + return fmt.Errorf("ListArgumentsModel: string too large") + } + return fmt.Errorf("ListArgumentsModel: %w", err) + } + if err := jr.ReadObjectColon(); err != nil { + return fmt.Errorf("ListArgumentsModel: %w", err) + } + switch name { + + // t.Cursor (string) (string) + case "cursor": + { + sval, err := jr.ReadStringOrNull(8192) + if err != nil { + if errors.Is(err, jsg.ErrLimitExceeded) { + return fmt.Errorf("t.Cursor: string too long") + } + return fmt.Errorf("t.Cursor: %w", err) + } + if sval != nil { + t.Cursor = (*string)(sval) + } + } + + // t.Size (uint64) (uint64) + case "size": + { + + nval, err := jr.ReadNumberAsUint64OrNull() + if err != nil { + return fmt.Errorf("t.Size: %w", err) + } + if nval != nil { + typed := uint64(*nval) + t.Size = &typed + } + + } + default: + // Field doesn't exist on this type, so ignore it + if err := jr.DiscardType(); err != nil { + return fmt.Errorf("ListArgumentsModel: ignoring field %s: %w", name, err) + } + } + + close, err := jr.ReadObjectCloseOrComma() + if err != nil { + return fmt.Errorf("ListArgumentsModel: %w", err) + } + if close { + break + } + if i == 8192-1 { + return fmt.Errorf("ListArgumentsModel: map too large") + } + } + } + + return nil +} +func (t *ListOKModel) MarshalDagJSON(w io.Writer) error { + jw := jsg.NewDagJsonWriter(w) + if t == nil { + err := jw.WriteNull() + return err + } + if err := jw.WriteObjectOpen(); err != nil { + return err + } + written := 0 + + // t.After (string) (string) + if t.After != nil { + if len("after") > 8192 { + return fmt.Errorf("String in field \"after\" was too long") + } + if err := jw.WriteString(string("after")); err != nil { + return fmt.Errorf("\"after\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + if t.After == nil { + if err := jw.WriteNull(); err != nil { + return fmt.Errorf("t.After: %w", err) + } + } else { + if len(*t.After) > 8192 { + return fmt.Errorf("String in field t.After was too long") + } + if err := jw.WriteString(string(*t.After)); err != nil { + return fmt.Errorf("t.After: %w", err) + } + } + written++ + } + if t.Before != nil { + if written > 0 { + if err := jw.WriteComma(); err != nil { + return err + } + } + } + + // t.Before (string) (string) + if t.Before != nil { + if len("before") > 8192 { + return fmt.Errorf("String in field \"before\" was too long") + } + if err := jw.WriteString(string("before")); err != nil { + return fmt.Errorf("\"before\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + if t.Before == nil { + if err := jw.WriteNull(); err != nil { + return fmt.Errorf("t.Before: %w", err) + } + } else { + if len(*t.Before) > 8192 { + return fmt.Errorf("String in field t.Before was too long") + } + if err := jw.WriteString(string(*t.Before)); err != nil { + return fmt.Errorf("t.Before: %w", err) + } + } + written++ + } + if t.Cursor != nil { + if written > 0 { + if err := jw.WriteComma(); err != nil { + return err + } + } + } + + // t.Cursor (string) (string) + if t.Cursor != nil { + if len("cursor") > 8192 { + return fmt.Errorf("String in field \"cursor\" was too long") + } + if err := jw.WriteString(string("cursor")); err != nil { + return fmt.Errorf("\"cursor\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + if t.Cursor == nil { + if err := jw.WriteNull(); err != nil { + return fmt.Errorf("t.Cursor: %w", err) + } + } else { + if len(*t.Cursor) > 8192 { + return fmt.Errorf("String in field t.Cursor was too long") + } + if err := jw.WriteString(string(*t.Cursor)); err != nil { + return fmt.Errorf("t.Cursor: %w", err) + } + } + written++ + } + if written > 0 { + if err := jw.WriteComma(); err != nil { + return err + } + } + + // t.Results ([]datamodel.ListBlobItem) (slice) + if len("results") > 8192 { + return fmt.Errorf("String in field \"results\" was too long") + } + if err := jw.WriteString(string("results")); err != nil { + return fmt.Errorf("\"results\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + if len(t.Results) > 8192 { + return fmt.Errorf("Slice value in field t.Results was too long") + } + + if err := jw.WriteArrayOpen(); err != nil { + return fmt.Errorf("t.Results: %w", err) + } + for i, v := range t.Results { + if i > 0 { + if err := jw.WriteComma(); err != nil { + return fmt.Errorf("t.Results: %w", err) + } + } + if err := v.MarshalDagJSON(jw); err != nil { + return fmt.Errorf("v: %w", err) + } + } + if err := jw.WriteArrayClose(); err != nil { + return fmt.Errorf("t.Results: %w", err) + } + + written++ + if written > 0 { + if err := jw.WriteComma(); err != nil { + return err + } + } + + // t.Size (uint64) (uint64) + if len("size") > 8192 { + return fmt.Errorf("String in field \"size\" was too long") + } + if err := jw.WriteString(string("size")); err != nil { + return fmt.Errorf("\"size\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + + if err := jw.WriteUint64(uint64(t.Size)); err != nil { + return fmt.Errorf("t.Size: %w", err) + } + + written++ + if err := jw.WriteObjectClose(); err != nil { + return err + } + return nil +} +func (t *ListOKModel) UnmarshalDagJSON(r io.Reader) (err error) { + *t = ListOKModel{} + + jr := jsg.NewDagJsonReader(r) + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + if err := jr.ReadObjectOpen(); err != nil { + return fmt.Errorf("ListOKModel: %w", err) + } + close, err := jr.PeekObjectClose() + if err != nil { + return fmt.Errorf("ListOKModel: %w", err) + } + if close { + if err := jr.ReadObjectClose(); err != nil { + return fmt.Errorf("ListOKModel: %w", err) + } + } else { + for i := uint64(0); i < 8192; i++ { + name, err := jr.ReadString(8192) + if err != nil { + if errors.Is(err, jsg.ErrLimitExceeded) { + return fmt.Errorf("ListOKModel: string too large") + } + return fmt.Errorf("ListOKModel: %w", err) + } + if err := jr.ReadObjectColon(); err != nil { + return fmt.Errorf("ListOKModel: %w", err) + } + switch name { + + // t.After (string) (string) + case "after": + { + sval, err := jr.ReadStringOrNull(8192) + if err != nil { + if errors.Is(err, jsg.ErrLimitExceeded) { + return fmt.Errorf("t.After: string too long") + } + return fmt.Errorf("t.After: %w", err) + } + if sval != nil { + t.After = (*string)(sval) + } + } + + // t.Before (string) (string) + case "before": + { + sval, err := jr.ReadStringOrNull(8192) + if err != nil { + if errors.Is(err, jsg.ErrLimitExceeded) { + return fmt.Errorf("t.Before: string too long") + } + return fmt.Errorf("t.Before: %w", err) + } + if sval != nil { + t.Before = (*string)(sval) + } + } + + // t.Cursor (string) (string) + case "cursor": + { + sval, err := jr.ReadStringOrNull(8192) + if err != nil { + if errors.Is(err, jsg.ErrLimitExceeded) { + return fmt.Errorf("t.Cursor: string too long") + } + return fmt.Errorf("t.Cursor: %w", err) + } + if sval != nil { + t.Cursor = (*string)(sval) + } + } + + // t.Results ([]datamodel.ListBlobItem) (slice) + case "results": + { + + if err := jr.ReadArrayOpen(); err != nil { + return fmt.Errorf("t.Results: %w", err) + } + + close, err := jr.PeekArrayClose() + if err != nil { + return fmt.Errorf("t.Results: %w", err) + } + if close { + if err := jr.ReadArrayClose(); err != nil { + return fmt.Errorf("t.Results: %w", err) + } + + } else { + for i := 0; i < 8192; i++ { + item := make([]ListBlobItem, 1) + + if err := item[0].UnmarshalDagJSON(jr); err != nil { + return fmt.Errorf("unmarshaling item[0]: %w", err) + } + + t.Results = append(t.Results, item[0]) + + close, err := jr.ReadArrayCloseOrComma() + if err != nil { + return fmt.Errorf("t.Results: %w", err) + } + if close { + break + } + if i == 8192-1 { + return fmt.Errorf("t.Results: slice too large") + } + } + } + + } + + // t.Size (uint64) (uint64) + case "size": + { + + nval, err := jr.ReadNumberAsUint64() + if err != nil { + return fmt.Errorf("t.Size: %w", err) + } + t.Size = uint64(nval) + + } + default: + // Field doesn't exist on this type, so ignore it + if err := jr.DiscardType(); err != nil { + return fmt.Errorf("ListOKModel: ignoring field %s: %w", name, err) + } + } + + close, err := jr.ReadObjectCloseOrComma() + if err != nil { + return fmt.Errorf("ListOKModel: %w", err) + } + if close { + break + } + if i == 8192-1 { + return fmt.Errorf("ListOKModel: map too large") + } + } + } + + return nil +} +func (t *ListBlobItem) MarshalDagJSON(w io.Writer) error { + jw := jsg.NewDagJsonWriter(w) + if t == nil { + err := jw.WriteNull() + return err + } + if err := jw.WriteObjectOpen(); err != nil { + return err + } + written := 0 + + // t.Blob (datamodel.BlobModel) (struct) + if len("blob") > 8192 { + return fmt.Errorf("String in field \"blob\" was too long") + } + if err := jw.WriteString(string("blob")); err != nil { + return fmt.Errorf("\"blob\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + if err := t.Blob.MarshalDagJSON(jw); err != nil { + return fmt.Errorf("t.Blob: %w", err) + } + written++ + if written > 0 { + if err := jw.WriteComma(); err != nil { + return err + } + } + + // t.InsertedAt (uint64) (uint64) + if len("insertedAt") > 8192 { + return fmt.Errorf("String in field \"insertedAt\" was too long") + } + if err := jw.WriteString(string("insertedAt")); err != nil { + return fmt.Errorf("\"insertedAt\": %w", err) + } + if err := jw.WriteObjectColon(); err != nil { + return err + } + + if err := jw.WriteUint64(uint64(t.InsertedAt)); err != nil { + return fmt.Errorf("t.InsertedAt: %w", err) + } + + written++ + if err := jw.WriteObjectClose(); err != nil { + return err + } + return nil +} +func (t *ListBlobItem) UnmarshalDagJSON(r io.Reader) (err error) { + *t = ListBlobItem{} + + jr := jsg.NewDagJsonReader(r) + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + if err := jr.ReadObjectOpen(); err != nil { + return fmt.Errorf("ListBlobItem: %w", err) + } + close, err := jr.PeekObjectClose() + if err != nil { + return fmt.Errorf("ListBlobItem: %w", err) + } + if close { + if err := jr.ReadObjectClose(); err != nil { + return fmt.Errorf("ListBlobItem: %w", err) + } + } else { + for i := uint64(0); i < 8192; i++ { + name, err := jr.ReadString(8192) + if err != nil { + if errors.Is(err, jsg.ErrLimitExceeded) { + return fmt.Errorf("ListBlobItem: string too large") + } + return fmt.Errorf("ListBlobItem: %w", err) + } + if err := jr.ReadObjectColon(); err != nil { + return fmt.Errorf("ListBlobItem: %w", err) + } + switch name { + + // t.Blob (datamodel.BlobModel) (struct) + case "blob": + + if err := t.Blob.UnmarshalDagJSON(jr); err != nil { + return fmt.Errorf("unmarshaling t.Blob: %w", err) + } + + // t.InsertedAt (uint64) (uint64) + case "insertedAt": + { + + nval, err := jr.ReadNumberAsUint64() + if err != nil { + return fmt.Errorf("t.InsertedAt: %w", err) + } + t.InsertedAt = uint64(nval) + + } + default: + // Field doesn't exist on this type, so ignore it + if err := jr.DiscardType(); err != nil { + return fmt.Errorf("ListBlobItem: ignoring field %s: %w", name, err) + } + } + + close, err := jr.ReadObjectCloseOrComma() + if err != nil { + return fmt.Errorf("ListBlobItem: %w", err) + } + if close { + break + } + if i == 8192-1 { + return fmt.Errorf("ListBlobItem: map too large") + } + } + } + + return nil +} diff --git a/capabilities/space/blob/datamodel/list.go b/capabilities/space/blob/datamodel/list.go new file mode 100644 index 0000000..f4da5de --- /dev/null +++ b/capabilities/space/blob/datamodel/list.go @@ -0,0 +1,21 @@ +package datamodel + +import sdm "github.com/alanshaw/libracha/capabilities/shared/datamodel" + +type ListArgumentsModel struct { + Cursor *string `cborgen:"cursor,omitempty" dagjsongen:"cursor,omitempty"` + Size *uint64 `cborgen:"size,omitempty" dagjsongen:"size,omitempty"` +} + +type ListOKModel struct { + Cursor *string `cborgen:"cursor,omitempty" dagjsongen:"cursor,omitempty"` + Before *string `cborgen:"before,omitempty" dagjsongen:"before,omitempty"` + After *string `cborgen:"after,omitempty" dagjsongen:"after,omitempty"` + Size uint64 `cborgen:"size" dagjsongen:"size"` + Results []ListBlobItem `cborgen:"results" dagjsongen:"results"` +} + +type ListBlobItem struct { + Blob sdm.BlobModel `cborgen:"blob" dagjsongen:"blob"` + InsertedAt uint64 `cborgen:"insertedAt" dagjsongen:"insertedAt"` +} diff --git a/capabilities/space/blob/list.go b/capabilities/space/blob/list.go new file mode 100644 index 0000000..18fcf22 --- /dev/null +++ b/capabilities/space/blob/list.go @@ -0,0 +1,17 @@ +package blob + +import ( + sbdm "github.com/alanshaw/libracha/capabilities/space/blob/datamodel" + "github.com/alanshaw/ucantone/validator/bindcap" +) + +const ListCommand = "/blob/list" + +type ( + ListArguments = sbdm.ListArgumentsModel + ListOK = sbdm.ListOKModel +) + +var List, _ = bindcap.New[*ListArguments]( + ListCommand, +)