Go binary/server for helping run/build sessions for the Maze Rats TTRPG
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

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)
}