Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}