diff options
Diffstat (limited to 'gopher.go')
| -rw-r--r-- | gopher.go | 86 | 
1 files changed, 28 insertions, 58 deletions
@@ -3,9 +3,7 @@ package syw  import (  	"bytes"  	"context" -	"os"  	"path" -	"path/filepath"  	"text/template"  	"tildegit.org/tjp/sliderule" @@ -65,55 +63,47 @@ func GopherRouter(repodir string, overrides *template.Template) *sliderule.Route  	repoRouter := &sliderule.Router{}  	repoRouter.Use(assignRepo(repodir)) -	repoRouter.Route("/branches", runGopherTemplate(tmpl, "branch_list.gph", gopher.MenuType)) -	repoRouter.Route("/tags", runGopherTemplate(tmpl, "tag_list.gph", gopher.MenuType)) -	repoRouter.Route("/refs/:ref", runGopherTemplate(tmpl, "ref.gph", gopher.MenuType)) -	repoRouter.Route("/refs/:ref/tree", gopherTreePath(tmpl, false)) -	repoRouter.Route("/refs/:ref/tree/*path", gopherTreePath(tmpl, true)) -	repoRouter.Route("/diffstat/:fromref/:toref", runGopherTemplate(tmpl, "diffstat.gph.txt", gopher.TextFileType)) -	repoRouter.Route("/diff/:fromref/:toref", runGopherTemplate(tmpl, "diff.gph.txt", gopher.TextFileType)) +	repoRouter.Route("/branches", repoRouteHandler(gopherProto, tmpl, "branch_list.gph")) +	repoRouter.Route("/tags", repoRouteHandler(gopherProto, tmpl, "tag_list.gph")) +	repoRouter.Route("/refs/:ref", repoRouteHandler(gopherProto, tmpl, "ref.gph")) +	repoRouter.Route("/refs/:ref/tree", gopherTreePath(tmpl)) +	repoRouter.Route("/refs/:ref/tree/*path", gopherTreePath(tmpl)) +	repoRouter.Route("/diffstat/:fromref/:toref", repoRouteHandler(gopherProto, tmpl, "diffstat.gph.txt")) +	repoRouter.Route("/diff/:fromref/:toref", repoRouteHandler(gopherProto, tmpl, "diff.gph.txt"))  	router := &sliderule.Router{} -	router.Route("/", gopherRoot(repodir, tmpl)) -	router.Route("/:"+reponamekey, assignRepo(repodir)(runGopherTemplate(tmpl, "repo_home.gph", gopher.MenuType))) +	router.Route("/", rootDirHandler(gopherProto, repodir, tmpl, "repo_root.gph")) +	router.Route("/:"+reponamekey, assignRepo(repodir)(repoRouteHandler(gopherProto, tmpl, "repo_home.gph")))  	router.Mount("/:"+reponamekey, repoRouter)  	return router  } -func gopherRoot(repodir string, tmpl *template.Template) sliderule.Handler { -	return sliderule.HandlerFunc(func(ctx context.Context, request *sliderule.Request) *sliderule.Response { -		entries, err := os.ReadDir(repodir) -		if err != nil { -			return gopher.Error(err).Response() -		} - -		names := []string{} -		for _, item := range entries { -			if Open(filepath.Join(repodir, item.Name())) != nil { -				names = append(names, item.Name()) -			} -		} +type gopherProtocol struct{ sliderule.ServerProtocol } -		buf := &bytes.Buffer{} -		obj := map[string]any{ -			"Repos":    names, -			"Host":     request.Hostname(), -			"Port":     request.Port(), -			"Selector": request.Path, -		} -		if err := tmpl.ExecuteTemplate(buf, "repo_root.gph", obj); err != nil { -			return gopher.Error(err).Response() -		} +func (gopherProtocol) TemplateBaseData(ctx context.Context, request *sliderule.Request) map[string]any { +	return map[string]any{ +		"Host":     request.Hostname(), +		"Port":     request.Port(), +		"Selector": request.Path, +	} +} -		return gopher.File(gopher.MenuType, buf) -	}) +func (gopherProtocol) TemplateRepoData(ctx context.Context, request *sliderule.Request) map[string]any { +	return map[string]any{ +		"Ctx":    ctx, +		"Repo":   ctx.Value(repokey), +		"Params": sliderule.RouteParams(ctx), +	}  } -func gopherTreePath(tmpl *template.Template, haspath bool) sliderule.Handler { +var gopherProto = gopherProtocol{gopher.ServerProtocol} + +func gopherTreePath(tmpl *template.Template) sliderule.Handler {  	return sliderule.HandlerFunc(func(ctx context.Context, request *sliderule.Request) *sliderule.Response {  		repo := ctx.Value(repokey).(*Repository)  		params := sliderule.RouteParams(ctx) +		_, haspath := params["path"]  		t := "tree"  		if haspath { @@ -128,7 +118,7 @@ func gopherTreePath(tmpl *template.Template, haspath bool) sliderule.Handler {  			if !haspath {  				params["path"] = ""  			} -			return runGopherTemplate(tmpl, "tree.gph", gopher.MenuType).Handle(ctx, request) +			return repoRouteHandler(gopherProto, tmpl, "tree.gph").Handle(ctx, request)  		}  		body, err := repo.Blob(ctx, params["ref"], params["path"]) @@ -143,23 +133,3 @@ func gopherTreePath(tmpl *template.Template, haspath bool) sliderule.Handler {  		return gopher.File(filetype, bytes.NewBuffer(body))  	})  } - -func runGopherTemplate(tmpl *template.Template, name string, filetype sliderule.Status) sliderule.Handler { -	return sliderule.HandlerFunc(func(ctx context.Context, request *sliderule.Request) *sliderule.Response { -		obj := map[string]any{ -			"Ctx":      ctx, -			"Repo":     ctx.Value(repokey), -			"Params":   sliderule.RouteParams(ctx), -			"Host":     request.Hostname(), -			"Port":     request.Port(), -			"Selector": request.Path, -		} -		buf := &bytes.Buffer{} - -		if err := tmpl.ExecuteTemplate(buf, name, obj); err != nil { -			return gopher.Error(err).Response() -		} - -		return gopher.File(filetype, buf) -	}) -}  | 
