Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

getters.gno

3.12 Kb · 75 lines
 1package memba_notes_rc1
 2
 3import (
 4	"encoding/base64"
 5	"gno.land/p/samcrew/avl"
 6	keys "gno.land/r/samcrew/enckeys_v1"
 7	"strconv"
 8	"strings"
 9)
10
11func q(s string) string    { return strconv.Quote(s) }
12func u(n uint64) string    { return q(strconv.FormatUint(n, 10)) }
13func blob(b []byte) string { return "\"" + base64.StdEncoding.EncodeToString(b) + "\"" }
14func noteJSON(n *note, withBody bool) string {
15	s := `{"id":` + q(idText(n.ID)) + `,"owner":` + q(string(n.Owner)) + `,"pending_owner":` + q(string(n.PendingOwner)) + `,"owner_generation":` + u(n.OwnerGeneration) + `,"mode":` + strconv.Itoa(int(n.Mode)) + `,"state_revision":` + u(n.Revision) + `,"title_revision":` + u(n.TitleRevision) + `,"body_revision":` + u(n.BodyRevision) + `,"epoch":` + u(uint64(n.Epoch)) + `,"body_bytes":` + q(strconv.Itoa(n.BodyBytes)) + `,"title_blob":` + blob(n.Title) + `,"commitment":` + blob(n.Commitment) + `,"deleted":` + strconv.FormatBool(n.Deleted) + `,"listed":` + strconv.FormatBool(n.Listed && !n.ModeratorHidden) + `,"owner_listed":` + strconv.FormatBool(n.Listed) + `,"moderator_hidden":` + strconv.FormatBool(n.ModeratorHidden) + `,"created_height":` + q(strconv.FormatInt(n.CreatedHeight, 10)) + `,"op_id":` + q(idText(n.Last.Operation)) + `,"executor":` + q(string(n.LastExecutor)) + `,"gov_writers":` + strconv.FormatBool(n.GovWriters) + `,"actor":` + q(string(n.Last.Actor)) + `,"height":` + q(strconv.FormatInt(n.Last.Height, 10))
16	if withBody {
17		s += `,"body_blob":` + blob(n.Body)
18	}
19	return s + `}`
20}
21func NoteJSON(idHex string) string {
22	v, ok := notes.Get(idText(readID(idHex)))
23	if !ok {
24		return "null"
25	}
26	return noteJSON(v.(*note), true)
27}
28func page(tree *avl.Tree, prefix, cursor string, limit int) string {
29	if limit < 1 || limit > MaxPage {
30		panic("notes: page limit")
31	}
32	if len(cursor) > 53 {
33		panic("notes: cursor length")
34	}
35	if cursor != "" {
36		if len(cursor) != 53 || cursor[20] != ':' {
37			panic("notes: bad cursor")
38		}
39		readID(cursor[21:])
40		for _, c := range cursor[:20] {
41			if c < '0' || c > '9' {
42				panic("notes: bad cursor")
43			}
44		}
45	}
46	end := prefix + "\xff"
47	if cursor != "" {
48		end = prefix + cursor
49	}
50	items := []string{}
51	next := ""
52	tree.ReverseIterate(prefix, end, func(key string, value interface{}) bool {
53		if cursor != "" && key == end {
54			return false
55		}
56		v, ok := notes.Get(value.(string))
57		if !ok {
58			panic("notes: corrupt index")
59		}
60		items = append(items, noteJSON(v.(*note), false))
61		next = strings.TrimPrefix(key, prefix)
62		return len(items) == limit
63	})
64	if len(items) < limit {
65		next = ""
66	}
67	return `{"items":[` + strings.Join(items, ",") + `],"next_cursor":` + q(next) + `}`
68}
69func ListByOwnerJSON(addr address, cursor string, limit int) string {
70	return page(ownerIndex, string(keys.CanonicalAddress(addr))+":", cursor, limit)
71}
72func ListPublicJSON(cursor string, limit int) string { return page(publicIndex, "", cursor, limit) }
73func ConfigJSON() string {
74	return `{"realm":` + q(RealmPath) + `,"admin":` + q(string(admin)) + `,"pending_admin":` + q(string(pendingAdmin)) + `,"treasury":` + q(string(treasury)) + `,"create_fee_ugnot":` + q(strconv.FormatInt(createFee, 10)) + `,"paused":` + strconv.FormatBool(paused) + `}`
75}