users.gno
1.25 Kb ยท 59 lines
1package users
2
3import (
4 "std"
5
6 "gno.land/p/demo/avl/rotree"
7)
8
9// ResolveName returns the latest UserData of a specific user by name or alias
10func ResolveName(name string) (data *UserData, isCurrent bool) {
11 raw, ok := nameStore.Get(name)
12 if !ok {
13 return nil, false
14 }
15
16 data = raw.(*UserData)
17 if data.deleted {
18 return nil, false
19 }
20
21 return data, name == data.username
22}
23
24// ResolveAddress returns the latest UserData of a specific user by address
25func ResolveAddress(addr std.Address) *UserData {
26 raw, ok := addressStore.Get(addr.String())
27 if !ok {
28 return nil
29 }
30
31 data := raw.(*UserData)
32 if data.deleted {
33 return nil
34 }
35
36 return data
37}
38
39// GetReadonlyAddrStore exposes the address store in readonly mode
40func GetReadonlyAddrStore() *rotree.ReadOnlyTree {
41 return rotree.Wrap(addressStore, makeUserDataSafe)
42}
43
44// GetReadOnlyNameStore exposes the name store in readonly mode
45func GetReadOnlyNameStore() *rotree.ReadOnlyTree {
46 return rotree.Wrap(nameStore, makeUserDataSafe)
47}
48
49func makeUserDataSafe(data any) any {
50 cpy := new(UserData)
51 *cpy = *(data.(*UserData))
52 if cpy.deleted {
53 return nil
54 }
55
56 // Note: when requesting data from this AVL tree, (exists bool) will be true
57 // Even if the data is "deleted". This is currently unavoidable
58 return cpy
59}