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

profile.gno

2.81 Kb · 144 lines
  1package profile
  2
  3import (
  4	"chain"
  5
  6	"gno.land/p/nt/avl/v0"
  7	"gno.land/p/nt/mux/v0"
  8	"gno.land/p/nt/ufmt/v0"
  9)
 10
 11var (
 12	fields = avl.NewTree()
 13	router = mux.NewRouter()
 14)
 15
 16// Standard fields
 17const (
 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)
 28
 29// Events
 30const (
 31	ProfileFieldCreated = "ProfileFieldCreated"
 32	ProfileFieldUpdated = "ProfileFieldUpdated"
 33)
 34
 35// Field types used when emitting event
 36const FieldType = "FieldType"
 37
 38const (
 39	BoolField   = "BoolField"
 40	StringField = "StringField"
 41	IntField    = "IntField"
 42)
 43
 44func init() {
 45	router.HandleFunc("", homeHandler)
 46	router.HandleFunc("u/{addr}", profileHandler)
 47	router.HandleFunc("f/{addr}/{field}", fieldHandler)
 48}
 49
 50// List of supported string fields
 51var stringFields = map[string]bool{
 52	DisplayName:   true,
 53	Homepage:      true,
 54	Bio:           true,
 55	Location:      true,
 56	Avatar:        true,
 57	GravatarEmail: true,
 58}
 59
 60// List of support int fields
 61var intFields = map[string]bool{
 62	Age: true,
 63}
 64
 65// List of support bool fields
 66var boolFields = map[string]bool{
 67	AvailableForHiring: true,
 68}
 69
 70// Setters
 71
 72func SetStringField(cur realm, field, value string) bool {
 73	addr := cur.Previous().Address()
 74	key := addr.String() + ":" + field
 75	updated := fields.Set(key, value)
 76
 77	event := ProfileFieldCreated
 78	if updated {
 79		event = ProfileFieldUpdated
 80	}
 81
 82	chain.Emit(event, FieldType, StringField, field, value)
 83
 84	return updated
 85}
 86
 87func SetIntField(cur realm, field string, value int) bool {
 88	addr := cur.Previous().Address()
 89	key := addr.String() + ":" + field
 90	updated := fields.Set(key, value)
 91
 92	event := ProfileFieldCreated
 93	if updated {
 94		event = ProfileFieldUpdated
 95	}
 96
 97	chain.Emit(event, FieldType, IntField, field, string(value))
 98
 99	return updated
100}
101
102func SetBoolField(cur realm, field string, value bool) bool {
103	addr := cur.Previous().Address()
104	key := addr.String() + ":" + field
105	updated := fields.Set(key, value)
106
107	event := ProfileFieldCreated
108	if updated {
109		event = ProfileFieldUpdated
110	}
111
112	chain.Emit(event, FieldType, BoolField, field, ufmt.Sprintf("%t", value))
113
114	return updated
115}
116
117// Getters
118
119func GetStringField(addr address, field, def string) string {
120	key := addr.String() + ":" + field
121	if value := fields.Get(key); value != nil {
122		return value.(string)
123	}
124
125	return def
126}
127
128func GetBoolField(addr address, field string, def bool) bool {
129	key := addr.String() + ":" + field
130	if value := fields.Get(key); value != nil {
131		return value.(bool)
132	}
133
134	return def
135}
136
137func GetIntField(addr address, field string, def int) int {
138	key := addr.String() + ":" + field
139	if value := fields.Get(key); value != nil {
140		return value.(int)
141	}
142
143	return def
144}