cmd/golangorg: introduce CodewalkServer

Preparation for moving to a new package.

Change-Id: Ib246f694f950eadcb9afa78e6551c8fb22e109a8
Reviewed-on: https://go-review.googlesource.com/c/website/+/317660
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/cmd/golangorg/codewalk.go b/cmd/golangorg/codewalk.go
index d3e5cbd..00a5ea5 100644
--- a/cmd/golangorg/codewalk.go
+++ b/cmd/golangorg/codewalk.go
@@ -36,36 +36,45 @@
 	"golang.org/x/website/internal/web"
 )
 
+type CodewalkServer struct {
+	fsys fs.FS
+	site *web.Site
+}
+
+func NewCodewalkServer(fsys fs.FS, site *web.Site) *CodewalkServer {
+	return &CodewalkServer{fsys, site}
+}
+
 // Handler for /doc/codewalk/ and below.
-func codewalk(w http.ResponseWriter, r *http.Request) {
+func (s *CodewalkServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	relpath := path.Clean(r.URL.Path[1:])
 
 	r.ParseForm()
 	if f := r.FormValue("fileprint"); f != "" {
-		codewalkFileprint(w, r, f)
+		s.codewalkFileprint(w, r, f)
 		return
 	}
 
 	// If directory exists, serve list of code walks.
-	dir, err := fs.Stat(fsys, relpath)
+	dir, err := fs.Stat(s.fsys, relpath)
 	if err == nil && dir.IsDir() {
-		codewalkDir(w, r, relpath)
+		s.codewalkDir(w, r, relpath)
 		return
 	}
 
 	// If file exists, serve using standard file server.
 	if err == nil {
-		site.ServeHTTP(w, r)
+		s.site.ServeHTTP(w, r)
 		return
 	}
 
 	// Otherwise append .xml and hope to find
 	// a codewalk description, but before trim
 	// the trailing /.
-	cw, err := loadCodewalk(relpath + ".xml")
+	cw, err := s.loadCodewalk(relpath + ".xml")
 	if err != nil {
 		log.Print(err)
-		site.ServeError(w, r, err)
+		s.site.ServeError(w, r, err)
 		return
 	}
 
@@ -74,7 +83,7 @@
 		return
 	}
 
-	site.ServePage(w, r, web.Page{
+	s.site.ServePage(w, r, web.Page{
 		Title:    "Codewalk: " + cw.Title,
 		TabTitle: cw.Title,
 		Template: "codewalk.html",
@@ -138,8 +147,8 @@
 }
 
 // loadCodewalk reads a codewalk from the named XML file.
-func loadCodewalk(filename string) (*Codewalk, error) {
-	f, err := fsys.Open(filename)
+func (s *CodewalkServer) loadCodewalk(filename string) (*Codewalk, error) {
+	f, err := s.fsys.Open(filename)
 	if err != nil {
 		return nil, err
 	}
@@ -160,7 +169,7 @@
 			i = len(st.Src)
 		}
 		filename := st.Src[0:i]
-		data, err := fs.ReadFile(fsys, filename)
+		data, err := fs.ReadFile(s.fsys, filename)
 		if err != nil {
 			st.Err = err
 			continue
@@ -201,16 +210,16 @@
 // codewalkDir serves the codewalk directory listing.
 // It scans the directory for subdirectories or files named *.xml
 // and prepares a table.
-func codewalkDir(w http.ResponseWriter, r *http.Request, relpath string) {
+func (s *CodewalkServer) codewalkDir(w http.ResponseWriter, r *http.Request, relpath string) {
 	type elem struct {
 		Name  string
 		Title string
 	}
 
-	dir, err := fs.ReadDir(fsys, relpath)
+	dir, err := fs.ReadDir(s.fsys, relpath)
 	if err != nil {
 		log.Print(err)
-		site.ServeError(w, r, err)
+		s.site.ServeError(w, r, err)
 		return
 	}
 	var v []interface{}
@@ -219,7 +228,7 @@
 		if fi.IsDir() {
 			v = append(v, &elem{name + "/", ""})
 		} else if strings.HasSuffix(name, ".xml") {
-			cw, err := loadCodewalk(relpath + "/" + name)
+			cw, err := s.loadCodewalk(relpath + "/" + name)
 			if err != nil {
 				continue
 			}
@@ -227,7 +236,7 @@
 		}
 	}
 
-	site.ServePage(w, r, web.Page{
+	s.site.ServePage(w, r, web.Page{
 		Title:    "Codewalks",
 		Template: "codewalkdir.html",
 		Data:     v,
@@ -240,12 +249,12 @@
 // in the response.  This format is used for the middle window pane
 // of the codewalk pages.  It is a separate iframe and does not get
 // the usual godoc HTML wrapper.
-func codewalkFileprint(w http.ResponseWriter, r *http.Request, f string) {
+func (s *CodewalkServer) codewalkFileprint(w http.ResponseWriter, r *http.Request, f string) {
 	relpath := strings.Trim(path.Clean(f), "/")
-	data, err := fs.ReadFile(fsys, relpath)
+	data, err := fs.ReadFile(s.fsys, relpath)
 	if err != nil {
 		log.Print(err)
-		site.ServeError(w, r, err)
+		s.site.ServeError(w, r, err)
 		return
 	}
 	lo, _ := strconv.Atoi(r.FormValue("lo"))
diff --git a/cmd/golangorg/handlers.go b/cmd/golangorg/handlers.go
index ee2cb77..6000ac3 100644
--- a/cmd/golangorg/handlers.go
+++ b/cmd/golangorg/handlers.go
@@ -67,13 +67,13 @@
 	return false
 }
 
-func registerHandlers(pres *web.Site) *http.ServeMux {
-	if pres == nil {
-		panic("nil Presentation")
+func registerHandlers(site *web.Site) *http.ServeMux {
+	if site == nil {
+		panic("nil Site")
 	}
 	mux := http.NewServeMux()
-	mux.Handle("/", pres)
-	mux.Handle("/doc/codewalk/", http.HandlerFunc(codewalk))
+	mux.Handle("/", site)
+	mux.Handle("/doc/codewalk/", NewCodewalkServer(fsys, site))
 	mux.Handle("/fmt", http.HandlerFunc(fmtHandler))
 	mux.Handle("/x/", http.HandlerFunc(xHandler))
 	redirect.Register(mux)