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}
profile.gno
2.78 Kb ยท 144 lines