package grc20reg import ( "std" "gno.land/p/demo/avl" "gno.land/p/demo/avl/rotree" "gno.land/p/demo/fqname" "gno.land/p/demo/grc/grc20" "gno.land/p/demo/ufmt" ) var registry = avl.NewTree() // rlmPath[.slug] -> TokenGetter (slug is optional) func Register(tokenGetter grc20.TokenGetter, slug string) { rlmPath := std.PreviousRealm().PkgPath() key := fqname.Construct(rlmPath, slug) registry.Set(key, tokenGetter) std.Emit( registerEvent, "pkgpath", rlmPath, "slug", slug, ) } func Get(key string) grc20.TokenGetter { tokenGetter, ok := registry.Get(key) if !ok { return nil } return tokenGetter.(grc20.TokenGetter) } func MustGet(key string) grc20.TokenGetter { tokenGetter := Get(key) if tokenGetter == nil { panic("unknown token: " + key) } return tokenGetter } func Render(path string) string { switch { case path == "": // home // TODO: add pagination s := "" count := 0 registry.Iterate("", "", func(key string, tokenI any) bool { count++ tokenGetter := tokenI.(grc20.TokenGetter) token := tokenGetter() rlmPath, slug := fqname.Parse(key) rlmLink := fqname.RenderLink(rlmPath, slug) infoLink := "/r/demo/grc20reg:" + key s += ufmt.Sprintf("- **%s** - %s - [info](%s)\n", token.GetName(), rlmLink, infoLink) return false }) if count == 0 { return "No registered token." } return s default: // specific token key := path tokenGetter := MustGet(key) token := tokenGetter() rlmPath, slug := fqname.Parse(key) rlmLink := fqname.RenderLink(rlmPath, slug) s := ufmt.Sprintf("# %s\n", token.GetName()) s += ufmt.Sprintf("- symbol: **%s**\n", token.GetSymbol()) s += ufmt.Sprintf("- realm: %s\n", rlmLink) s += ufmt.Sprintf("- decimals: %d\n", token.GetDecimals()) s += ufmt.Sprintf("- total supply: %d\n", token.TotalSupply()) return s } } const registerEvent = "register" func GetRegistry() *rotree.ReadOnlyTree { return rotree.Wrap(registry, nil) }