package main import ( "errors" "os" "strconv" "strings" "github.com/codegangsta/cli" "github.com/minio-io/minio/pkgs/strbyteconv" ) func main() { app := cli.NewApp() app.Name = "erasure-demo" app.Usage = "erasure encode a byte stream" app.Commands = []cli.Command{ { Name: "encode", Usage: "erasure encode a byte stream", Action: encode, Flags: []cli.Flag{ cli.StringFlag{ Name: "output,o", Value: "", Usage: "Output file", }, cli.StringFlag{ Name: "protection-level", Value: "10,6", Usage: "data,parity", }, cli.StringFlag{ Name: "block-size", Value: "1M", Usage: "Size of blocks. Examples: 1K, 1M, full", }, }, }, { Name: "decode", Usage: "erasure decode a byte stream", Action: decode, Flags: []cli.Flag{ cli.StringFlag{ Name: "output,o", Value: "", Usage: "Output file", }, cli.StringFlag{ Name: "protection-level", Value: "10,6", Usage: "data,parity", }, }, }, } app.Run(os.Args) } // config representing cli input type inputConfig struct { input string output string k int m int blockSize uint64 } // parses input and returns an inputConfig with parsed input func parseInput(c *cli.Context) (inputConfig, error) { // get input path inputFilePath := c.Args().Get(0) // get output path outputFilePath := inputFilePath if c.String("output") != "" { outputFilePath = c.String("output") } protectionLevel := c.String("protection-level") protectionLevelSplit := strings.Split(protectionLevel, ",") if len(protectionLevelSplit) != 2 { return inputConfig{}, errors.New("Malformed input for protection-level") } k, err := strconv.Atoi(protectionLevelSplit[0]) if err != nil { return inputConfig{}, err } m, err := strconv.Atoi(protectionLevelSplit[1]) if err != nil { return inputConfig{}, err } var blockSize uint64 blockSize = 0 if c.String("block-size") != "" { if c.String("block-size") != "full" { blockSize, err = strbyteconv.StringToBytes(c.String("block-size")) if err != nil { return inputConfig{}, err } } } return inputConfig{ input: inputFilePath, output: outputFilePath, k: k, m: m, blockSize: blockSize, }, nil }