derive.gno
1.34 Kb ยท 70 lines
1package derive
2
3import (
4 "chain"
5 "chain/runtime"
6 "net/url"
7 "strings"
8
9 "gno.land/p/nt/ufmt"
10 "gno.land/r/leon/hor"
11)
12
13var cd = runtime.ChainDomain()
14
15func Render(path string) string {
16 out := "# Derive Realm Address\n\n"
17
18 out += `<gno-form>
19 <gno-input name="pkgpath" placeholder="gno.land/{r,p}/..." />
20 </gno-form>
21`
22
23 if strings.Contains(path, "pkgpath") {
24 parsed := parsePkgPath(path)
25 if parsed == "" {
26 out += "Please input a valid pkgpath."
27 return out
28 }
29 out += ufmt.Sprintf("### [%s](%s) matches %s", parsed, strings.TrimPrefix(parsed, "gno.land"), chain.PackageAddress(parsed))
30 }
31
32 return out
33}
34
35func parsePkgPath(path string) string {
36 u, err := url.Parse(path)
37 if err != nil {
38 return ""
39 }
40
41 pkgpath := u.Query().Get("pkgpath")
42 if pkgpath == "" {
43 return ""
44 }
45
46 switch {
47 case strings.HasPrefix(pkgpath, "gno.land/r/"),
48 strings.HasPrefix(pkgpath, "gno.land/p/"):
49 // already absolute and valid
50 return pkgpath
51
52 case strings.HasPrefix(pkgpath, "r/"),
53 strings.HasPrefix(pkgpath, "p/"):
54 // relative path, normalize
55 return "gno.land/" + pkgpath
56
57 case strings.HasPrefix(pkgpath, "/r/"),
58 strings.HasPrefix(pkgpath, "/p/"):
59 // relative with leading slash
60 return "gno.land" + pkgpath
61
62 default:
63 // reject invalid
64 return ""
65 }
66}
67
68func init() {
69 hor.Register(cross, "Derive", "Quickly derive a Gno address from a pkg path.")
70}