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