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.Generate() template := t.Template() output, err := buildOutput(i, 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) }