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}