profile.gno

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