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  }