package main import ( "fmt" "net/http" "os" "path/filepath" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/urfave/cli/v2" ) var Commands = []*cli.Command{} var version = "dev" func main() { app := &cli.App{ Commands: []*cli.Command{ { Name: "serve", Aliases: []string{"c"}, Flags: []cli.Flag{ &cli.StringFlag{ Name: "listen", Aliases: []string{"l"}, Value: "127.0.0.1", }, &cli.StringFlag{ Name: "port", Aliases: []string{"p"}, Value: "4000", }, &cli.StringFlag{ Name: "api-url", Aliases: []string{"u"}, Value: "http://127.0.0.1:4000", }, &cli.StringFlag{ Name: "directory", Aliases: []string{"d"}, Value: ".", }, }, Usage: "complete a task on the list", Action: func(ctx *cli.Context) error { listen := ctx.String("listen") port := ctx.Int64("port") directory := ctx.String("directory") url := ctx.String("url") e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) e.GET("/api/list", func(ctx echo.Context) error { return apiList(ctx, directory, url) }) e.Logger.Fatal(e.Start(fmt.Sprintf("%s:%d", listen, port))) return nil }, }, }, } if err := app.Run(os.Args); err != nil { fmt.Println(err) } } type File struct { Name string `json:"name"` Url string `json:"url"` } type InternalError struct { Error string `json:"error"` } func apiList(ctx echo.Context, directory, url string) error { files := []File{} err := filepath.Walk(directory, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { return nil } file := File{ Name: string(info.Name()), Url: fmt.Sprintf("%s/api/file?path=%s", url, path), } files = append(files, file) return nil }) if err != nil { return ctx.JSON(http.StatusInternalServerError, InternalError{Error: fmt.Sprintf("%s", err)}) } return ctx.JSON(http.StatusOK, files) }