diff --git a/cmd/muxt/data/new/main.txtar b/cmd/muxt/data/new/main.txtar deleted file mode 100644 index 49438d0..0000000 --- a/cmd/muxt/data/new/main.txtar +++ /dev/null @@ -1,113 +0,0 @@ -exec go mod tidy -exec go mod download -muxt generate --receiver-static-type=Server -exec go generate -run counterfeiter -exec go test . - --- main.go -- -package server - -import ( - "context" - "embed" - "html/template" - "log" - "net/http" -) - -//go:embed *.gohtml -var templateFiles embed.FS - -var templates = template.Must(template.ParseFS(templateFiles, "*")) - -//go:generate go run github.com/crhntr/muxt generate --receiver-static-type=Server -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate - -//counterfeiter:generate . - -func main() { - srv := Server{} - mux := http.NewServeMux() - routes(mux, &srv) - log.Fatal(http.ListenAndServe(":8080", mux)) -} - -type Server struct{} - -type IndexData struct { - Name string -} - -func (srv *Server) Index(ctx context.Context) IndexData { - return IndexData{ - Name: "friend", - } -} - --- tools/tools.go -- -//go:build tools - -package tools - -import ( - _ "github.com/crhntr/muxt" - _ "github.com/maxbrunsfeld/counterfeiter/v6" -) - --- index.gohtml -- - - -{{block "head" "Welcome!"}} - - - {{.}} - - - - -{{end}} - -
- -

Hello, {{.Name}}!

- -{{- define "GET /{$} Index(ctx)" -}} - {{template "index.gohtml" .}} -{{- end -}} - -
-{{block "footer" 0}} - -{{end}} - - - -{{define "About"}} - - -{{template "head" "About"}} - -
- -

About Page

- -
- - -{{end}}{{- define "GET /about" -}} - {{template "About" .}} -{{- end -}} - diff --git a/cmd/muxt/data/new/main/cmd/server/main.go b/cmd/muxt/data/new/main/cmd/server/main.go deleted file mode 100644 index 79afed6..0000000 --- a/cmd/muxt/data/new/main/cmd/server/main.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "cmp" - "log" - "net/http" - "os" - - "github.com/crhntr/muxt/cmd/muxt/data/new/main/internal/hypertext" -) - -func main() { - srv := hypertext.Server{} - mux := http.NewServeMux() - srv.RegisterRoutes(mux) - log.Fatal(http.ListenAndServe(":"+cmp.Or(os.Getenv("PORT"), "8080"), mux)) -} diff --git a/cmd/muxt/data/new/main/internal/fake/server.go b/cmd/muxt/data/new/main/internal/fake/server.go deleted file mode 100644 index 4d40175..0000000 --- a/cmd/muxt/data/new/main/internal/fake/server.go +++ /dev/null @@ -1,110 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fake - -import ( - "context" - "sync" - - "github.com/crhntr/muxt/cmd/muxt/data/new/main/internal/hypertext" -) - -type Server struct { - IndexStub func(context.Context) hypertext.IndexData - indexMutex sync.RWMutex - indexArgsForCall []struct { - arg1 context.Context - } - indexReturns struct { - result1 hypertext.IndexData - } - indexReturnsOnCall map[int]struct { - result1 hypertext.IndexData - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *Server) Index(arg1 context.Context) hypertext.IndexData { - fake.indexMutex.Lock() - ret, specificReturn := fake.indexReturnsOnCall[len(fake.indexArgsForCall)] - fake.indexArgsForCall = append(fake.indexArgsForCall, struct { - arg1 context.Context - }{arg1}) - stub := fake.IndexStub - fakeReturns := fake.indexReturns - fake.recordInvocation("Index", []interface{}{arg1}) - fake.indexMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Server) IndexCallCount() int { - fake.indexMutex.RLock() - defer fake.indexMutex.RUnlock() - return len(fake.indexArgsForCall) -} - -func (fake *Server) IndexCalls(stub func(context.Context) hypertext.IndexData) { - fake.indexMutex.Lock() - defer fake.indexMutex.Unlock() - fake.IndexStub = stub -} - -func (fake *Server) IndexArgsForCall(i int) context.Context { - fake.indexMutex.RLock() - defer fake.indexMutex.RUnlock() - argsForCall := fake.indexArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Server) IndexReturns(result1 hypertext.IndexData) { - fake.indexMutex.Lock() - defer fake.indexMutex.Unlock() - fake.IndexStub = nil - fake.indexReturns = struct { - result1 hypertext.IndexData - }{result1} -} - -func (fake *Server) IndexReturnsOnCall(i int, result1 hypertext.IndexData) { - fake.indexMutex.Lock() - defer fake.indexMutex.Unlock() - fake.IndexStub = nil - if fake.indexReturnsOnCall == nil { - fake.indexReturnsOnCall = make(map[int]struct { - result1 hypertext.IndexData - }) - } - fake.indexReturnsOnCall[i] = struct { - result1 hypertext.IndexData - }{result1} -} - -func (fake *Server) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.indexMutex.RLock() - defer fake.indexMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *Server) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} diff --git a/cmd/muxt/data/new/main/internal/hypertext/index.gohtml b/cmd/muxt/data/new/main/internal/hypertext/index.gohtml deleted file mode 100644 index b2bd035..0000000 --- a/cmd/muxt/data/new/main/internal/hypertext/index.gohtml +++ /dev/null @@ -1,56 +0,0 @@ - - -{{block "head" "Welcome!"}} - - - {{.}} - - - - -{{end}} - -
- -

Hello, {{.Name}}!

- -{{- define "GET /{$} Index(ctx)" -}} - {{template "index.gohtml" .}} -{{- end -}} - -
-{{block "footer" 0}} - -{{end}} - - - -{{define "About"}} - - -{{template "head" "About"}} - -
- -

About Page

- -
- - -{{end}}{{- define "GET /about" -}} - {{template "About" .}} -{{- end -}} - diff --git a/cmd/muxt/data/new/main/internal/hypertext/server.go b/cmd/muxt/data/new/main/internal/hypertext/server.go deleted file mode 100644 index c9afbce..0000000 --- a/cmd/muxt/data/new/main/internal/hypertext/server.go +++ /dev/null @@ -1,34 +0,0 @@ -package hypertext - -import ( - "context" - "embed" - "html/template" - "net/http" -) - -//go:embed *.gohtml -var templateFiles embed.FS - -var templates = template.Must(template.ParseFS(templateFiles, "*")) - -//go:generate go run github.com/crhntr/muxt/cmd/muxt generate --receiver-static-type=Server --receiver-interface-name=serverInterface -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate - -//counterfeiter:generate -o=../fake/server.go --fake-name=Server . serverInterface - -type Server struct{} - -func (srv *Server) RegisterRoutes(mux *http.ServeMux) { - routes(mux, srv) -} - -type IndexData struct { - Name string -} - -func (srv *Server) Index(_ context.Context) IndexData { - return IndexData{ - Name: "friend", - } -} diff --git a/cmd/muxt/data/new/main/internal/hypertext/server_test.go b/cmd/muxt/data/new/main/internal/hypertext/server_test.go deleted file mode 100644 index 8bf97ba..0000000 --- a/cmd/muxt/data/new/main/internal/hypertext/server_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package hypertext - -import ( - "context" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestServer_Index(t *testing.T) { - t.Run("it returns a name", func(t *testing.T) { - server := Server{} - ctx := context.Background() - data := server.Index(ctx) - require.NotZero(t, data.Name) - }) -} diff --git a/cmd/muxt/data/new/main/internal/hypertext/template_routes.go b/cmd/muxt/data/new/main/internal/hypertext/template_routes.go deleted file mode 100644 index 0824585..0000000 --- a/cmd/muxt/data/new/main/internal/hypertext/template_routes.go +++ /dev/null @@ -1,36 +0,0 @@ -// Code generated by muxt. DO NOT EDIT. - -package hypertext - -import ( - "bytes" - "context" - "net/http" -) - -type serverInterface interface { - Index(_ context.Context) IndexData -} - -func routes(mux *http.ServeMux, receiver serverInterface) { - mux.HandleFunc("GET /about", func(response http.ResponseWriter, request *http.Request) { - execute(response, request, true, "GET /about", http.StatusOK, request) - }) - mux.HandleFunc("GET /{$}", func(response http.ResponseWriter, request *http.Request) { - ctx := request.Context() - data := receiver.Index(ctx) - execute(response, request, true, "GET /{$} Index(ctx)", http.StatusOK, data) - }) -} -func execute(response http.ResponseWriter, request *http.Request, writeHeader bool, name string, code int, data any) { - buf := bytes.NewBuffer(nil) - if err := templates.ExecuteTemplate(buf, name, data); err != nil { - http.Error(response, err.Error(), http.StatusInternalServerError) - return - } - if writeHeader { - response.Header().Set("content-type", "text/html; charset=utf-8") - response.WriteHeader(code) - } - _, _ = buf.WriteTo(response) -} diff --git a/cmd/muxt/data/new/main/internal/hypertext/template_routes_test.go b/cmd/muxt/data/new/main/internal/hypertext/template_routes_test.go deleted file mode 100644 index a143afa..0000000 --- a/cmd/muxt/data/new/main/internal/hypertext/template_routes_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package hypertext - -import ( - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/crhntr/dom/domtest" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/crhntr/muxt/cmd/muxt/data/new/main/internal/fake" -) - -func TestTemplates(t *testing.T) { - for _, tt := range []struct { - Name string - Request func(rsv *fake.Server) *http.Request - Response func(rsv *fake.Server, res *http.Response) - }{ - { - Name: "the header has the name", - Request: func(srv *fake.Server) *http.Request { - srv.IndexReturns(IndexData{ - Name: "somebody", - }) - return httptest.NewRequest(http.MethodGet, "/", nil) - }, - Response: func(rsv *fake.Server, res *http.Response) { - if assert.Equal(t, 1, rsv.IndexCallCount()) { - ctx := rsv.IndexArgsForCall(0) - require.NotNil(t, ctx) - } - assert.Equal(t, http.StatusOK, res.StatusCode) - doc := domtest.Response(t, res) - if el := doc.QuerySelector(`h1`); assert.NotNil(t, el) { - assert.Equal(t, "Hello, somebody!", strings.TrimSpace(el.TextContent())) - } - }, - }, - } { - t.Run(tt.Name, func(t *testing.T) { - srv := new(fake.Server) - mux := http.NewServeMux() - routes(mux, srv) - rec := httptest.NewRecorder() - req := tt.Request(srv) - mux.ServeHTTP(rec, req) - tt.Response(srv, rec.Result()) - }) - } -} diff --git a/cmd/muxt/data/new/main/internal/tools/imports.go b/cmd/muxt/data/new/main/internal/tools/imports.go deleted file mode 100644 index f370584..0000000 --- a/cmd/muxt/data/new/main/internal/tools/imports.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build tools - -package tools - -import ( - _ "github.com/maxbrunsfeld/counterfeiter/v6" - - _ "github.com/crhntr/muxt" -) diff --git a/cmd/muxt/main.go b/cmd/muxt/main.go index 4ac4aa4..17da5fb 100644 --- a/cmd/muxt/main.go +++ b/cmd/muxt/main.go @@ -24,8 +24,6 @@ func command(wd string, args []string, getEnv func(string) string, stdout, stder switch cmd, cmdArgs := args[0], args[1:]; cmd { case "generate", "gen", "g": return generateCommand(cmdArgs, wd, getEnv, stdout, stderr) - case "new", "n": - return newCommand(cmdArgs, wd, getEnv, stdout, stderr) } } return fmt.Errorf("unknown command") diff --git a/cmd/muxt/new.go b/cmd/muxt/new.go deleted file mode 100644 index 5e0f7b6..0000000 --- a/cmd/muxt/new.go +++ /dev/null @@ -1,80 +0,0 @@ -package main - -import ( - "bufio" - "bytes" - "context" - "embed" - "flag" - "fmt" - "io" - "io/fs" - "os" - "path" - "slices" - "strings" - - "golang.org/x/tools/txtar" - "rsc.io/script" -) - -//go:embed data/new/*.txtar -var projectTemplates embed.FS - -func newCommand(args []string, workingDirectory string, _ func(string) string, stdout, stderr io.Writer) error { - templateFilePaths, err := fs.Glob(projectTemplates, "data/new/*.txtar") - if err != nil { - return fmt.Errorf("failed to load new project templates") - } - var newProjectTemplateNames []string - for _, filePath := range templateFilePaths { - name := strings.TrimSuffix(path.Base(filePath), path.Ext(filePath)) - newProjectTemplateNames = append(newProjectTemplateNames, name) - } - var ( - templateName string - ) - flagSet := flag.NewFlagSet("new", flag.ContinueOnError) - flagSet.SetOutput(stderr) - flagSet.StringVar(&templateName, "template", "main", fmt.Sprintf("new project template name one of: [%s]", strings.Join(newProjectTemplateNames, ", "))) - if err := flagSet.Parse(args); err != nil { - return fmt.Errorf("failed to parse arguments for new command: %w", err) - } - - i := slices.Index(newProjectTemplateNames, templateName) - if i < 0 { - return fmt.Errorf("unknown new project tamplate name: %q", templateName) - } - selectedTemplateName := templateFilePaths[i] - - buf, err := fs.ReadFile(projectTemplates, selectedTemplateName) - if err != nil { - return fmt.Errorf("failed to read new project template: %w", err) - } - - archive := txtar.Parse(buf) - dir, err := txtar.FS(archive) - if err != nil { - return fmt.Errorf("failed to use new project template as directory: %w", err) - } - if err := os.CopyFS(workingDirectory, dir); err != nil { - return fmt.Errorf("failed to copy new project template files to output directory %q: %w", workingDirectory, err) - } - - eng := script.NewEngine() - eng.Cmds["muxt"] = scriptCommand() - ctx := context.Background() - state, err := script.NewState(ctx, workingDirectory, os.Environ()) - if err != nil { - return fmt.Errorf("failed to setup project template script: %w", err) - } - _, _ = fmt.Fprintf(stdout, "running script:\n") - _, _ = stdout.Write(archive.Comment) - _, _ = io.WriteString(stdout, "\n") - if err := eng.Execute(state, templateName, bufio.NewReader(bytes.NewReader(archive.Comment)), stderr); err != nil { - return fmt.Errorf("failed while running project template script: %w", err) - } - - _, err = fmt.Fprintf(stdout, "new project generated\nnow run:\n\n\tgo generate") - return err -} diff --git a/cmd/muxt/new_test.go b/cmd/muxt/new_test.go deleted file mode 100644 index 22eec54..0000000 --- a/cmd/muxt/new_test.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "testing" - -func TestNew(t *testing.T) { - commandTest(t, "testdata/new/*.txtar") -} diff --git a/cmd/muxt/testdata/new/main.txtar b/cmd/muxt/testdata/new/main.txtar deleted file mode 100644 index 1da2f7e..0000000 --- a/cmd/muxt/testdata/new/main.txtar +++ /dev/null @@ -1,7 +0,0 @@ -exec go mod init example.com/my-project - -muxt new - -stdout 'new project generated' -stdout 'now run:' -stdout 'go generate'