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}