esp-modman/main.go

225 lines
4.7 KiB
Go
Raw Normal View History

2022-12-02 02:24:13 +01:00
package main
import (
2022-12-03 18:56:36 +01:00
"encoding/json"
2022-12-02 02:24:13 +01:00
"fmt"
"os"
)
type Command struct {
Name string
Description string
2022-12-03 18:56:36 +01:00
Action func([]string) (string, error)
2022-12-02 02:24:13 +01:00
Arguments []string
IsVarargs bool
}
var commands = []Command{
{
Name: "install",
Description: "Install one or more mod archives into modman",
2022-12-03 18:56:36 +01:00
Arguments: []string{"game name", "archive path"},
2022-12-02 02:24:13 +01:00
IsVarargs: true,
2022-12-03 18:56:36 +01:00
Action: func(arguments []string) (string, error) {
var argumentCount = len(arguments)
2022-12-02 02:24:13 +01:00
2022-12-03 18:56:36 +01:00
if argumentCount == 0 {
return "", fmt.Errorf("expected game name")
}
2022-12-02 02:24:13 +01:00
2022-12-03 18:56:36 +01:00
var modsToInstall = arguments[1:]
var installedMods = []string{}
2022-12-02 02:24:13 +01:00
2022-12-03 18:56:36 +01:00
if gameError := WithGame(arguments[0], func(game *Game) error {
var installed, installError = game.InstallMods(modsToInstall)
2022-12-02 02:24:13 +01:00
2022-12-03 18:56:36 +01:00
if installError != nil {
return installError
2022-12-02 02:24:13 +01:00
}
2022-12-03 18:56:36 +01:00
installedMods = installed
return nil
}); gameError != nil {
return "", gameError
2022-12-02 02:24:13 +01:00
}
2022-12-03 18:56:36 +01:00
return fmt.Sprint(len(installedMods), " of ", len(modsToInstall), " installed"), nil
2022-12-02 02:24:13 +01:00
},
},
{
Name: "remove",
Description: "Remove one or more mods from modman",
2022-12-03 18:56:36 +01:00
Arguments: []string{"game name", "mod name"},
2022-12-02 02:24:13 +01:00
IsVarargs: true,
2022-12-03 18:56:36 +01:00
Action: func(arguments []string) (string, error) {
var argumentCount = len(arguments)
if argumentCount == 0 {
return "", fmt.Errorf("expected game name")
}
var modsToRemove = arguments[1:]
var removedMods = []string{}
if gameError := WithGame(arguments[0], func(game *Game) error {
var removed, removeError = game.RemoveMods(modsToRemove)
if removeError != nil {
return removeError
}
removedMods = removed
return nil
}); gameError != nil {
return "", gameError
}
return fmt.Sprint(len(removedMods), " of ", len(removedMods), " removed"), nil
2022-12-02 02:24:13 +01:00
},
},
{
Name: "rename",
Description: "Rename a mod within modman",
2022-12-03 18:56:36 +01:00
Arguments: []string{"game name", "mod name", "new name"},
2022-12-02 02:24:13 +01:00
IsVarargs: false,
2022-12-03 18:56:36 +01:00
Action: func(arguments []string) (string, error) {
if len(arguments) != 3 {
return "", fmt.Errorf("expected game name followed by mod name and new name")
}
if gameError := WithGame(arguments[0], func(game *Game) error {
if removeError := game.RenameMod(arguments[1], arguments[2]); removeError != nil {
return removeError
}
return nil
}); gameError != nil {
return "", gameError
}
return "", nil
2022-12-02 02:24:13 +01:00
},
},
{
2022-12-03 18:56:36 +01:00
Name: "manifest",
Description: "Retrieve a manifest of all installed mods",
Arguments: []string{"game name", "format"},
2022-12-02 02:24:13 +01:00
IsVarargs: false,
2022-12-03 18:56:36 +01:00
Action: func(arguments []string) (string, error) {
if len(arguments) != 2 {
return "", fmt.Errorf("expected game name followed by format")
}
var modManifest = ""
if gameError := WithGame(arguments[0], func(game *Game) error {
var format = arguments[1]
var formatter, formatterExists = formatters[format]
if !(formatterExists) {
return fmt.Errorf("unsupported format: `%s`", format)
}
var formattedManifest, formatError = formatter(game.Mods)
if formatError != nil {
return formatError
}
// TODO: Reconsider if always casting formatted data to string for output is a good
// idea.
modManifest = string(formattedManifest)
return nil
}); gameError != nil {
return "", gameError
}
return modManifest, nil
2022-12-02 02:24:13 +01:00
},
},
{
Name: "deploy",
Description: "Deploy all installed and enabled mods",
2022-12-03 18:56:36 +01:00
Arguments: []string{"game name"},
2022-12-02 02:24:13 +01:00
IsVarargs: false,
2022-12-03 18:56:36 +01:00
Action: func(arguments []string) (string, error) {
2022-12-02 02:24:13 +01:00
// TODO: Implement.
2022-12-03 18:56:36 +01:00
return "", fmt.Errorf("not implemented")
2022-12-02 02:24:13 +01:00
},
},
}
2022-12-03 18:56:36 +01:00
var formatters = map[string]func(any) ([]byte, error){
"json": func(data any) ([]byte, error) {
var marshalledJson, marshalError = json.Marshal(data)
if marshalError != nil {
return nil, marshalError
}
return marshalledJson, nil
},
}
2022-12-02 02:24:13 +01:00
func main() {
var argCount = len(os.Args)
if argCount == 1 {
fmt.Println("Modman v0.1")
fmt.Println("Enter one of the following commands following modman:")
for i := range commands {
var command = commands[i]
fmt.Print("\t", command.Name)
for j := range command.Arguments {
fmt.Print(" [", command.Arguments[j], "]")
}
if command.IsVarargs {
fmt.Println("...")
} else {
fmt.Println()
}
}
return
}
var commandName = os.Args[1]
for i := range commands {
var command = commands[i]
if command.Name == commandName {
2022-12-03 18:56:36 +01:00
var response, actionError = command.Action(os.Args[2:])
2022-12-02 02:24:13 +01:00
2022-12-03 18:56:36 +01:00
if actionError != nil {
fmt.Fprintln(os.Stderr, actionError.Error())
2022-12-02 02:24:13 +01:00
os.Exit(1)
}
2022-12-03 18:56:36 +01:00
if len(response) != 0 {
fmt.Println(response)
}
2022-12-02 02:24:13 +01:00
return
}
}
2022-12-03 18:56:36 +01:00
fmt.Fprintf(os.Stderr, "unknown command: `%s`\n", commandName)
2022-12-02 02:24:13 +01:00
}