1package outfmt23import (4 "math/rand"5 "strconv"6 "strings"78 "gno.land/p/nt/ufmt/v0"9)1011type Result struct {12 Number int13 Text string14 Numbers []int15}1617func (res *Result) String() string {18 output := ufmt.Sprintf("Text: %s\n", res.Text)19 output += ufmt.Sprintf("Number: %d\n", res.Number)2021 output += "Numbers:"22 for _, number := range res.Numbers {23 output += ufmt.Sprintf(" %d", number)24 }25 output += "\n"2627 return output28}2930var rSeed = rand.NewPCG(0, 0)3132func genResult() Result {33 r := rand.New(rSeed)3435 // init rand36 res := Result{37 Text: "Hello Gnomes!",38 Number: r.IntN(1000),39 }4041 length := r.IntN(8) + 242 res.Numbers = make([]int, length)43 for i := 0; i < length; i++ {44 res.Numbers[i] = r.IntN(100)45 }4647 return res48}4950// marshal function to manually convert struct to JSON string51func (r Result) marshal() string {52 // Start JSON string53 jsonStr := `{"Number":` + strconv.Itoa(r.Number) + `,"Text":"` + r.Text + `","Numbers":[`5455 for i, num := range r.Numbers {56 jsonStr += strconv.Itoa(num)57 if i < len(r.Numbers)-1 {58 jsonStr += ","59 }60 }6162 jsonStr += "]}"6364 return jsonStr65}6667func Render(path string) string {68 if path == "" {69 output := ""70 output += "* [?fmt=stringer](/r/moul/outfmt:?fmt=stringer)\n"71 output += "* [?fmt=json](/r/moul/outfmt:?fmt=json)\n"72 output += "* [?fmt=jsonp](/r/moul/outfmt:?fmt=jsonp)\n"73 return output74 }7576 // parsing77 fmt := "stringer" // default78 // FIXME: whitelist and use net/url.79 {80 parts := strings.Split(path, "?")81 if len(parts) == 2 {82 // path := parts[0]83 query := parts[1]84 if query != "" {85 parts = strings.Split(query, "=")86 if len(parts) == 2 {87 k := parts[0]88 v := parts[1]89 if k == "fmt" {90 fmt = v91 }92 }93 }94 }95 }9697 // rendering9899 res := genResult()100 switch fmt {101 case "stringer":102 return res.String()103 case "json":104 // FIXME: return content-type?105 out := res.marshal()106 return string(out)107 case "jsonp":108 // FIXME: return content-type?109 callback := "callback" // FIXME: get it from query110 out := res.marshal()111 return callback + "(" + string(out) + ")"112 default:113 panic("unknown format")114 }115}116117func checkErr(err error) {118 if err != nil {119 panic(err)120 }121}122Render(path string) string
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.