From ec0850fa9fbb4e74e65f09d92b477d781328d23f Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 2 Oct 2018 17:48:09 +0300 Subject: [PATCH] examples: piecestore-cli use cobra directly (#409) --- examples/piecestore-cli/main.go | 228 ++++++++++++++------------------ 1 file changed, 99 insertions(+), 129 deletions(-) diff --git a/examples/piecestore-cli/main.go b/examples/piecestore-cli/main.go index d95b345da..f107b3c12 100644 --- a/examples/piecestore-cli/main.go +++ b/examples/piecestore-cli/main.go @@ -8,145 +8,115 @@ import ( "fmt" "io" "os" - "sort" "github.com/spf13/cobra" - "github.com/urfave/cli" - "github.com/zeebo/errs" pstore "storj.io/storj/pkg/piecestore" "storj.io/storj/pkg/process" ) -var argError = errs.Class("argError") - -func run(_ *cobra.Command, args []string) error { - app := cli.NewApp() - - app.Name = "Piece Store CLI" - app.Usage = "Store data in hash folder structure" - app.Version = "1.0.0" - - app.Flags = []cli.Flag{} - - app.Commands = []cli.Command{ - { - Name: "store", - Aliases: []string{"s"}, - Usage: "Store data by id", - ArgsUsage: "[id] [dataPath] [storeDir]", - Action: func(c *cli.Context) error { - if c.Args().Get(0) == "" { - return argError.New("No id specified") - } - - id := c.Args().Get(0) - - if c.Args().Get(1) == "" { - return argError.New("No input file specified") - } - - path := c.Args().Get(1) - - if c.Args().Get(2) == "" { - return argError.New("No output directory specified") - } - - outputDir := c.Args().Get(2) - - file, err := os.Open(path) - if err != nil { - return err - } - - // Close the file when we are done - defer printError(file.Close) - - fileInfo, err := os.Stat(path) - if err != nil { - return err - } - - if fileInfo.IsDir() { - return argError.New(fmt.Sprintf("Path (%s) is a directory, not a file", path)) - } - - dataFileChunk, err := pstore.StoreWriter(id, outputDir) - if err != nil { - return err - } - - // Close when finished - defer printError(dataFileChunk.Close) - - _, err = io.Copy(dataFileChunk, file) - - return err - }, - }, - { - Name: "retrieve", - Aliases: []string{"r"}, - Usage: "Retrieve data by id and print to Stdout", - ArgsUsage: "[id] [storeDir]", - Action: func(c *cli.Context) error { - if c.Args().Get(0) == "" { - return argError.New("Missing data id") - } - if c.Args().Get(1) == "" { - return argError.New("Missing file path") - } - fileInfo, err := os.Stat(c.Args().Get(1)) - if err != nil { - return err - } - - if !fileInfo.IsDir() { - return argError.New(fmt.Sprintf("Path (%s) is a file, not a directory", c.Args().Get(1))) - } - - dataFileChunk, err := pstore.RetrieveReader(context.Background(), - c.Args().Get(0), 0, -1, c.Args().Get(1)) - if err != nil { - return err - } - - // Close when finished - defer printError(dataFileChunk.Close) - - _, err = io.Copy(os.Stdout, dataFileChunk) - return err - }, - }, - { - Name: "delete", - Aliases: []string{"d"}, - Usage: "Delete data by id", - ArgsUsage: "[id] [storeDir]", - Action: func(c *cli.Context) error { - if c.Args().Get(0) == "" { - return argError.New("Missing data id") - } - if c.Args().Get(1) == "" { - return argError.New("No directory specified") - } - return pstore.Delete(c.Args().Get(0), c.Args().Get(1)) - }, - }, - } - - sort.Sort(cli.FlagsByName(app.Flags)) - sort.Sort(cli.CommandsByName(app.Commands)) - - return app.Run(append([]string{os.Args[0]}, args...)) -} - func main() { - process.Exec(&cobra.Command{ + cobra.EnableCommandSorting = false + root := &cobra.Command{ Use: "piecestore-cli", Short: "piecestore example cli", - RunE: run, - }) + } + + root.AddCommand( + storeMain, + retrieveMain, + deleteMain, + ) + + process.Exec(root) +} + +var storeMain = &cobra.Command{ + Use: "store [id] [dataPath] [storeDir]", + Aliases: []string{"s"}, + Short: "Store data by id", + Args: cobra.ExactArgs(3), + ValidArgs: []string{"id", "datapath", "storedir"}, + + RunE: func(cmd *cobra.Command, args []string) error { + id := args[0] + path := args[1] + outputDir := args[2] + + file, err := os.Open(path) + if err != nil { + return err + } + + // Close the file when we are done + defer printError(file.Close) + + fileInfo, err := os.Stat(path) + if err != nil { + return err + } + + if fileInfo.IsDir() { + return fmt.Errorf("Path (%s) is a directory, not a file", path) + } + + dataFileChunk, err := pstore.StoreWriter(id, outputDir) + if err != nil { + return err + } + + // Close when finished + defer printError(dataFileChunk.Close) + + _, err = io.Copy(dataFileChunk, file) + + return err + }, +} + +var retrieveMain = &cobra.Command{ + Use: "retrieve [id] [storeDir]", + Aliases: []string{"r"}, + Args: cobra.ExactArgs(2), + Short: "Retrieve data by id and print to Stdout", + + RunE: func(cmd *cobra.Command, args []string) error { + id := args[0] + path := args[1] + + fileInfo, err := os.Stat(path) + if err != nil { + return err + } + + if !fileInfo.IsDir() { + return fmt.Errorf("Path (%s) is a file, not a directory", path) + } + + dataFileChunk, err := pstore.RetrieveReader(context.Background(), id, 0, -1, path) + if err != nil { + return err + } + + // Close when finished + defer printError(dataFileChunk.Close) + + _, err = io.Copy(os.Stdout, dataFileChunk) + return err + }, +} + +var deleteMain = &cobra.Command{ + Use: "delete [id] [storeDir]", + Aliases: []string{"d"}, + Args: cobra.ExactArgs(2), + Short: "Delete data by id", + + RunE: func(cmd *cobra.Command, args []string) error { + id := args[0] + directory := args[1] + return pstore.Delete(id, directory) + }, } func printError(fn func() error) {