profile.gno

2.78 Kb ยท 144 lines
  1package profile
  2
  3import (
  4	"std"
  5
  6	"gno.land/p/demo/avl"
  7	"gno.land/p/demo/mux"
  8	"gno.land/p/demo/ufmt"
  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(field, value string) bool {
 73	addr := std.PreviousRealm().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	std.Emit(event, FieldType, StringField, field, value)
 83
 84	return updated
 85}
 86
 87func SetIntField(field string, value int) bool {
 88	addr := std.PreviousRealm().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	std.Emit(event, FieldType, IntField, field, string(value))
 98
 99	return updated
100}
101
102func SetBoolField(field string, value bool) bool {
103	addr := std.PreviousRealm().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	std.Emit(event, FieldType, BoolField, field, ufmt.Sprintf("%t", value))
113
114	return updated
115}
116
117// Getters
118
119func GetStringField(addr std.Address, field, def string) string {
120	key := addr.String() + ":" + field
121	if value, ok := fields.Get(key); ok {
122		return value.(string)
123	}
124
125	return def
126}
127
128func GetBoolField(addr std.Address, field string, def bool) bool {
129	key := addr.String() + ":" + field
130	if value, ok := fields.Get(key); ok {
131		return value.(bool)
132	}
133
134	return def
135}
136
137func GetIntField(addr std.Address, field string, def int) int {
138	key := addr.String() + ":" + field
139	if value, ok := fields.Get(key); ok {
140		return value.(int)
141	}
142
143	return def
144}