package main import ( "errors" "flag" "fmt" "os" "riedstra.dev/mitch/steam-export/config" "riedstra.dev/mitch/steam-export/steam" ) var ( errorHandling flag.ErrorHandling = flag.ExitOnError steamLib *steam.Library = &steam.Library{} ) func parseArgs(args []string) error { if len(args) < 2 { return errors.New("Not enough arguments") } aa := args[2:] switch a := args[1]; a { case "list": return listGames(aa) case "package": return packageGame(aa) case "extract": return extractGame(aa) case "delete": return deleteGame(aa) case "edit-config": return editConfig(aa) default: printHelp() } return nil } func printHelp() { fmt.Printf(`--- Program usage: steam-export-cli $subcommand $options Subcommands: list package extract delete server edit-config Type in a subcommand -h or -help for more information `) } func editConfig(args []string) error { fl := flag.NewFlagSet("edit-config", errorHandling) e := fl.String("e", "", "Editor to invoke") if err := fl.Parse(args); err != nil { return err } return config.EditDefaultConfig(*e) } func listGames(args []string) error { fl := flag.NewFlagSet("list", errorHandling) lib := fl.String("l", steam.DefaultLib, "Path to library in question. All the way to the 'steamapps' folder") l := steam.DefaultLib fl.Parse(args) if fl.Parsed() { l = string(*lib) } if err := steamLib.ProcessLibrary(l); err != nil { return err } fmt.Println(steamLib) return nil } func packageGame(args []string) error { fl := flag.NewFlagSet("package", errorHandling) lib := fl.String("l", steam.DefaultLib, "Path to library in question. All the way to the 'steamapps' folder") fileName := fl.String("f", "export", "Name of the archive file to be created. Please do not include the file extension") game := fl.Int("g", -1, "Index of the game to be exported. Please see `list` for the index") compress := fl.String("z", "gz", "Compression type. Default 'gz' '' is no compression") var g int l := steam.DefaultLib fl.Parse(args) if fl.Parsed() { l = string(*lib) g = int(*game) } if err := steamLib.ProcessLibrary(l); err != nil { return err } if len(steamLib.Games) < g || g == -1 { return errors.New("Cannot find game for index provided or no index provided") } if *fileName == "export" { fileName = &steamLib.Games[g] } switch *compress { case "gz": return steamLib.PackageGameToFile(g, *fileName+".tar.gz", *compress) default: return steamLib.PackageGameToFile(g, *fileName+".tar", *compress) } } func extractGame(args []string) error { fl := flag.NewFlagSet("extract", errorHandling) lib := fl.String("l", steam.DefaultLib, "Path to library in question. All the way to the 'steamapps' folder") fileName := fl.String("f", "", "Name of the archive file to be extracted. Please include the file extension") compress := fl.String("z", "gz", "Compression type. Default 'gz' '' is no compression") l := steam.DefaultLib fl.Parse(args) if fl.Parsed() { l = string(*lib) } if err := steamLib.ProcessLibrary(l); err != nil { return err } if *fileName == "" { return errors.New("No filename provided") } return steamLib.ExtractGameFromFile(*fileName, *compress) } func deleteGame(args []string) error { fl := flag.NewFlagSet("delete", errorHandling) lib := fl.String("l", steam.DefaultLib, "Path to library in question. All the way to the 'steamapps' folder") game := fl.Int("g", -1, "Index of the game to be deleted. Please see `list` for the index") var g int l := steam.DefaultLib fl.Parse(args) if fl.Parsed() { l = string(*lib) g = int(*game) } if err := steamLib.ProcessLibrary(l); err != nil { return err } if len(steamLib.Games) < g || g == -1 { return errors.New("Cannot find game for index provided or no index provided") } return steamLib.DeleteGame(g) } func main() { config, err := config.LoadConfig() if err != nil { fmt.Println(err) } else { if config.DefaultRepository != "" { steam.DefaultLib = config.DefaultRepository } } if err := parseArgs(os.Args); err != nil { fmt.Fprintln(os.Stderr, err) printHelp() } }