1package profile23import (4 "chain"56 "gno.land/p/nt/avl/v0"7 "gno.land/p/nt/mux/v0"8 "gno.land/p/nt/ufmt/v0"9)1011var (12 fields = avl.NewTree()13 router = mux.NewRouter()14)1516// Standard fields17const (18 DisplayName = "DisplayName"19 Homepage = "Homepage"20 Bio = "Bio"21 Age = "Age"22 Location = "Location"23 Avatar = "Avatar"24 GravatarEmail = "GravatarEmail"25 AvailableForHiring = "AvailableForHiring"26 InvalidField = "InvalidField"27)2829// Events30const (31 ProfileFieldCreated = "ProfileFieldCreated"32 ProfileFieldUpdated = "ProfileFieldUpdated"33)3435// Field types used when emitting event36const FieldType = "FieldType"3738const (39 BoolField = "BoolField"40 StringField = "StringField"41 IntField = "IntField"42)4344func init() {45 router.HandleFunc("", homeHandler)46 router.HandleFunc("u/{addr}", profileHandler)47 router.HandleFunc("f/{addr}/{field}", fieldHandler)48}4950// List of supported string fields51var stringFields = map[string]bool{52 DisplayName: true,53 Homepage: true,54 Bio: true,55 Location: true,56 Avatar: true,57 GravatarEmail: true,58}5960// List of support int fields61var intFields = map[string]bool{62 Age: true,63}6465// List of support bool fields66var boolFields = map[string]bool{67 AvailableForHiring: true,68}6970// Setters7172func SetStringField(cur realm, field, value string) bool {73 addr := cur.Previous().Address()74 key := addr.String() + ":" + field75 updated := fields.Set(key, value)7677 event := ProfileFieldCreated78 if updated {79 event = ProfileFieldUpdated80 }8182 chain.Emit(event, FieldType, StringField, field, value)8384 return updated85}8687func SetIntField(cur realm, field string, value int) bool {88 addr := cur.Previous().Address()89 key := addr.String() + ":" + field90 updated := fields.Set(key, value)9192 event := ProfileFieldCreated93 if updated {94 event = ProfileFieldUpdated95 }9697 chain.Emit(event, FieldType, IntField, field, string(value))9899 return updated100}101102func SetBoolField(cur realm, field string, value bool) bool {103 addr := cur.Previous().Address()104 key := addr.String() + ":" + field105 updated := fields.Set(key, value)106107 event := ProfileFieldCreated108 if updated {109 event = ProfileFieldUpdated110 }111112 chain.Emit(event, FieldType, BoolField, field, ufmt.Sprintf("%t", value))113114 return updated115}116117// Getters118119func GetStringField(addr address, field, def string) string {120 key := addr.String() + ":" + field121 if value := fields.Get(key); value != nil {122 return value.(string)123 }124125 return def126}127128func GetBoolField(addr address, field string, def bool) bool {129 key := addr.String() + ":" + field130 if value := fields.Get(key); value != nil {131 return value.(bool)132 }133134 return def135}136137func GetIntField(addr address, field string, def int) int {138 key := addr.String() + ":" + field139 if value := fields.Get(key); value != nil {140 return value.(int)141 }142143 return def144}145GetBoolField(addr string, field string, def bool) bool
GetIntField(addr string, field string, def int) int
GetStringField(addr string, field string, def string) string
Render(path string) string
SetBoolField(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, field string, value bool) bool
SetIntField(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, field string, value int) bool
SetStringField(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, field string, value string) bool
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.