You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.1 KiB
131 lines
3.1 KiB
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/spf13/cobra"
|
|
"mazeratsgen/internal/dice"
|
|
"mazeratsgen/internal/tables"
|
|
"time"
|
|
)
|
|
|
|
var generateCmd = &cobra.Command{
|
|
Use: "generate",
|
|
Short: "Generate various things",
|
|
}
|
|
|
|
var generateNameCmd = &cobra.Command{
|
|
Use: "name",
|
|
Short: "Generate a name",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
n := tables.GenRandomName(flagSeed)
|
|
template := "{{.FullName}}"
|
|
output, err := buildOutput(n, template, flagFormat)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf(output)
|
|
},
|
|
}
|
|
|
|
var generateCharCmd = &cobra.Command{
|
|
Use: "character",
|
|
Short: "Generate a playable character",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
t := tables.CharacterTable{Roller: dice.NewRoller(flagSeed)}
|
|
i := t.Generate()
|
|
template := t.Template()
|
|
output, err := buildOutput(i, template, flagFormat)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf(output)
|
|
},
|
|
}
|
|
|
|
var generateMonsterCmd = &cobra.Command{
|
|
Use: "monster",
|
|
Short: "Generate a monster",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
t := tables.MonsterTable{Roller: dice.NewRoller(flagSeed)}
|
|
i := t.Generate()
|
|
template := t.Template()
|
|
output, err := buildOutput(i, template, flagFormat)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf(output)
|
|
},
|
|
}
|
|
|
|
var generateCityCmd = &cobra.Command{
|
|
Use: "city",
|
|
Short: "Generate a city",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
t := tables.CityTable{Roller: dice.NewRoller(flagSeed)}
|
|
i := t.Generate()
|
|
template := t.Template()
|
|
output, err := buildOutput(i, template, flagFormat)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf(output)
|
|
},
|
|
}
|
|
|
|
var generateSpellCmd = &cobra.Command{
|
|
Use: "spell",
|
|
Short: "Generate a spell",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
t := tables.MagicTable{Roller: dice.NewRoller(flagSeed)}
|
|
i := t.Spell(t.Roller.TableRoll())
|
|
output, err := buildOutput(i, "{{.}}", flagFormat)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf(output)
|
|
},
|
|
}
|
|
|
|
var generateNPCCmd = &cobra.Command{
|
|
Use: "npc",
|
|
Short: "Generate an NPC",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
t := tables.NPCTable{Roller: dice.NewRoller(flagSeed)}
|
|
output, err := buildOutput(t.Generate(), t.Template(), flagFormat)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf(output)
|
|
},
|
|
}
|
|
|
|
func buildOutput(i interface{}, template string, format string) (string, error) {
|
|
var output interface{}
|
|
var err error
|
|
if format == "json" {
|
|
output, err = tables.ConvertToJSON(i)
|
|
} else {
|
|
output, err = tables.ConvertToText(i, template)
|
|
}
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return fmt.Sprintf("%s\n", output), nil
|
|
}
|
|
|
|
var flagFormat string
|
|
var flagSeed int64
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(generateCmd)
|
|
|
|
generateCmd.PersistentFlags().StringVarP(&flagFormat, "format", "f", "text", `output format: "text", "json"`)
|
|
generateCmd.PersistentFlags().Int64VarP(&flagSeed, "seed", "s", time.Now().UnixNano(), "seed for randomness")
|
|
|
|
generateCmd.AddCommand(generateCharCmd)
|
|
generateCmd.AddCommand(generateCityCmd)
|
|
generateCmd.AddCommand(generateMonsterCmd)
|
|
generateCmd.AddCommand(generateNameCmd)
|
|
generateCmd.AddCommand(generateSpellCmd)
|
|
generateCmd.AddCommand(generateNPCCmd)
|
|
}
|
|
|