.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.1.1-0.20210319172145-bda8f5cee399 / cmd / godoc / handlers.go
1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package main
6
7 import (
8         "encoding/json"
9         "go/format"
10         "log"
11         "net/http"
12         "text/template"
13
14         "golang.org/x/tools/godoc"
15         "golang.org/x/tools/godoc/redirect"
16         "golang.org/x/tools/godoc/vfs"
17
18         _ "golang.org/x/tools/playground" // register "/compile" playground redirect
19 )
20
21 var (
22         pres *godoc.Presentation
23         fs   = vfs.NameSpace{}
24 )
25
26 func registerHandlers(pres *godoc.Presentation) {
27         if pres == nil {
28                 panic("nil Presentation")
29         }
30         mux := http.NewServeMux()
31         mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
32                 if req.URL.Path == "/" {
33                         http.Redirect(w, req, "/pkg/", http.StatusFound)
34                         return
35                 }
36                 pres.ServeHTTP(w, req)
37         })
38         mux.Handle("/pkg/C/", redirect.Handler("/cmd/cgo/"))
39         mux.HandleFunc("/fmt", fmtHandler)
40         redirect.Register(mux)
41
42         http.Handle("/", mux)
43 }
44
45 func readTemplate(name string) *template.Template {
46         if pres == nil {
47                 panic("no global Presentation set yet")
48         }
49         path := "lib/godoc/" + name
50
51         // use underlying file system fs to read the template file
52         // (cannot use template ParseFile functions directly)
53         data, err := vfs.ReadFile(fs, path)
54         if err != nil {
55                 log.Fatal("readTemplate: ", err)
56         }
57         // be explicit with errors (for app engine use)
58         t, err := template.New(name).Funcs(pres.FuncMap()).Parse(string(data))
59         if err != nil {
60                 log.Fatal("readTemplate: ", err)
61         }
62         return t
63 }
64
65 func readTemplates(p *godoc.Presentation) {
66         p.CallGraphHTML = readTemplate("callgraph.html")
67         p.DirlistHTML = readTemplate("dirlist.html")
68         p.ErrorHTML = readTemplate("error.html")
69         p.ExampleHTML = readTemplate("example.html")
70         p.GodocHTML = readTemplate("godoc.html")
71         p.ImplementsHTML = readTemplate("implements.html")
72         p.MethodSetHTML = readTemplate("methodset.html")
73         p.PackageHTML = readTemplate("package.html")
74         p.PackageRootHTML = readTemplate("packageroot.html")
75         p.SearchHTML = readTemplate("search.html")
76         p.SearchDocHTML = readTemplate("searchdoc.html")
77         p.SearchCodeHTML = readTemplate("searchcode.html")
78         p.SearchTxtHTML = readTemplate("searchtxt.html")
79 }
80
81 type fmtResponse struct {
82         Body  string
83         Error string
84 }
85
86 // fmtHandler takes a Go program in its "body" form value, formats it with
87 // standard gofmt formatting, and writes a fmtResponse as a JSON object.
88 func fmtHandler(w http.ResponseWriter, r *http.Request) {
89         resp := new(fmtResponse)
90         body, err := format.Source([]byte(r.FormValue("body")))
91         if err != nil {
92                 resp.Error = err.Error()
93         } else {
94                 resp.Body = string(body)
95         }
96         w.Header().Set("Content-type", "application/json; charset=utf-8")
97         json.NewEncoder(w).Encode(resp)
98 }