github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/r/x/manfred_outfmt/outfmt.gno (about) 1 package outfmt 2 3 import ( 4 "encoding/json" 5 "strings" 6 7 "gno.land/p/demo/rand" 8 "gno.land/p/demo/ufmt" 9 ) 10 11 type Result struct { 12 Number int 13 Text string 14 Numbers []int 15 } 16 17 func (res *Result) String() string { 18 output := ufmt.Sprintf("Text: %s\n", res.Text) 19 output += ufmt.Sprintf("Number: %d\n", res.Number) 20 21 output += "Numbers:" 22 for _, number := range res.Numbers { 23 output += ufmt.Sprintf(" %d", number) 24 } 25 output += "\n" 26 27 return output 28 } 29 30 var rSeed int64 31 32 func genResult() Result { 33 // init rand 34 r := rand.FromSeed(rSeed) 35 defer func() { rSeed = r.Seed() }() 36 37 res := Result{ 38 Text: "Hello Gnomes!", 39 Number: r.Intn(1000), 40 } 41 42 length := r.Intn(8) + 2 43 res.Numbers = make([]int, length) 44 for i := 0; i < length; i++ { 45 res.Numbers[i] = r.Intn(100) 46 } 47 48 return res 49 } 50 51 func Render(path string) string { 52 if path == "" { 53 output := "" 54 output += "* [?fmt=stringer](/r/x/manfred_outfmt:?fmt=stringer)\n" 55 output += "* [?fmt=json](/r/x/manfred_outfmt:?fmt=json)\n" 56 output += "* [?fmt=jsonp](/r/x/manfred_outfmt:?fmt=jsonp)\n" 57 return output 58 } 59 60 // parsing 61 fmt := "stringer" // default 62 // FIXME: whitelist and use net/url. 63 { 64 parts := strings.Split(path, "?") 65 if len(parts) == 2 { 66 // path := parts[0] 67 query := parts[1] 68 if query != "" { 69 parts = strings.Split(query, "=") 70 if len(parts) == 2 { 71 k := parts[0] 72 v := parts[1] 73 if k == "fmt" { 74 fmt = v 75 } 76 } 77 } 78 } 79 } 80 81 // rendering 82 83 res := genResult() 84 switch fmt { 85 case "stringer": 86 return res.String() 87 case "json": 88 // FIXME: return content-type? 89 out, err := json.Marshal(res) 90 checkErr(err) 91 return string(out) 92 case "jsonp": 93 // FIXME: return content-type? 94 callback := "callback" // FIXME: get it from query 95 out, err := json.Marshal(res) 96 checkErr(err) 97 return callback + "(" + string(out) + ")" 98 default: 99 panic("unknown format") 100 } 101 } 102 103 func checkErr(err error) { 104 if err != nil { 105 panic(err) 106 } 107 }