render.gno

2.42 Kb ยท 109 lines
  1package impl
  2
  3import (
  4	"std"
  5	"strconv"
  6	"strings"
  7
  8	"gno.land/p/demo/avl/pager"
  9	"gno.land/p/demo/mux"
 10	"gno.land/p/demo/ufmt"
 11	"gno.land/r/gov/dao"
 12)
 13
 14type render struct {
 15	relativeRealmPath string
 16	router            *mux.Router
 17	pssPager          *pager.Pager
 18}
 19
 20func NewRender(d *GovDAO) *render {
 21	ren := &render{
 22		pssPager: pager.NewPager(d.pss.Tree, 3, true),
 23	}
 24
 25	r := mux.NewRouter()
 26
 27	r.HandleFunc("/", func(rw *mux.ResponseWriter, req *mux.Request) {
 28		rw.Write(ren.renderActiveProposals(req.RawPath, d))
 29	})
 30
 31	r.HandleFunc("", func(rw *mux.ResponseWriter, req *mux.Request) {
 32		rw.Write(ren.renderActiveProposals(req.RawPath, d))
 33	})
 34
 35	r.HandleFunc("{pid}", func(rw *mux.ResponseWriter, req *mux.Request) {
 36		rw.Write(ren.renderProposal(req.GetVar("pid"), d))
 37	})
 38
 39	r.HandleFunc("{pid}/votes", func(rw *mux.ResponseWriter, req *mux.Request) {
 40		rw.Write(ren.renderVotesForProposal(req.GetVar("pid"), d))
 41	})
 42
 43	ren.router = r
 44
 45	return ren
 46}
 47
 48func (ren *render) Render(pkgPath string, path string) string {
 49	relativePath, found := strings.CutPrefix(pkgPath, std.ChainDomain())
 50	if !found {
 51		panic(ufmt.Sprintf(
 52			"realm package with unexpected name found: %v in chain domain %v",
 53			pkgPath, std.ChainDomain()))
 54	}
 55	ren.relativeRealmPath = relativePath
 56	return ren.router.Render(path)
 57}
 58
 59func (ren *render) renderActiveProposals(url string, d *GovDAO) string {
 60	out := "# Active Proposals:\n"
 61
 62	page, err := ren.pssPager.GetPageByPath(url)
 63	if err != nil {
 64		out += ufmt.Sprintf("Error getting selected page: %v", err.Error())
 65		return out
 66	}
 67
 68	for _, item := range page.Items {
 69		out += ren.renderProposal(item.Key, d)
 70	}
 71
 72	out += page.Picker("")
 73
 74	return out
 75}
 76
 77func (ren *render) renderProposal(sPid string, d *GovDAO) string {
 78	pid, err := strconv.Atoi(sPid)
 79	if err != nil {
 80		panic(err.Error())
 81	}
 82	ps := d.pss.GetStatus(dao.ProposalID(pid))
 83
 84	p := dao.MustGetProposal(cross, dao.ProposalID(pid))
 85
 86	out := ""
 87	out += ufmt.Sprintf("## Proposal with id: %v", sPid)
 88	out += StringifyProposal(p)
 89	out += "\n\n"
 90	out += ps.String()
 91	out += ufmt.Sprintf("- [Go to votes list](%v:%v/votes).", ren.relativeRealmPath, sPid)
 92	out += "\n\n"
 93
 94	return out
 95}
 96
 97func (ren *render) renderVotesForProposal(sPid string, d *GovDAO) string {
 98	pid, err := strconv.Atoi(sPid)
 99	if err != nil {
100		panic(err.Error())
101	}
102	ps := d.pss.GetStatus(dao.ProposalID(pid))
103
104	out := ""
105	out += ufmt.Sprintf("## Voters for Proposal with id: %v\n\n", sPid)
106	out += StringifyVotes(ps)
107
108	return out
109}