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}