// am-gen generates schema files and Grafana dashboards.
package main import ( ) const EnvGrafanaToken = "GRAFANA_TOKEN" func init() { // read .env _ = godotenv.Load() } func main() { := context.Background() var cli.Args := arg.MustParse(&) if .Version { fmt.Println(utils.GetVersion()) os.Exit(0) } if .Subcommand() == nil { .Fail("missing subcommand (starter-kit, schema, schema-from-file, " + "grafana)\n" + .Description()) } switch { case .Starter != nil: if := genStarterKit(, .Starter); != nil { fmt.Println() os.Exit(1) } case .Schema != nil: if := genStatesFile(, .Schema); != nil { fmt.Println() os.Exit(1) } case .StatesFile != nil: if := genStatesFile(, .StatesFile); != nil { fmt.Println() os.Exit(1) } case .SchemaFile != nil: if := genSchemaYaml(, .SchemaFile); != nil { fmt.Println() os.Exit(1) } case .Grafana != nil: .Grafana.Token = os.Getenv(EnvGrafanaToken) if := genGrafana(, .Grafana); != nil { fmt.Println() os.Exit(1) } } } func genStarterKit( context.Context, *cli.StarterParams) error { return generator.GenStarterKit(, ) } func genSchemaYaml( context.Context, *cli.SchemaFileParams) error { , := generator.SchemaFileToParams(*) if != nil { return } return genStatesFile(, &) } func genGrafana( context.Context, *cli.GrafanaParams) error { , := generator.GenDashboard(*) if != nil { return } if .GrafanaUrl != "" { return generator.SyncDashboard(, *, ) } fmt.Println(.MarshalIndentJSON()) return nil } func genStatesFile( context.Context, *cli.SchemaParams) error { if .States == "" && len(.State) == 0 { return errors.New("either --state or --states is required") } // generate , := generator.NewSchemaGenerator(, *) if != nil { return } if .Output { fmt.Print(.Output()) return nil } := fmt.Sprintf("ss_%s.go", camelToSnake(.Name)) if !fileExists() || .Force { // save ss_ := []byte(.Output()) = os.WriteFile(, , 0666) if != nil { return } fmt.Printf("Generated %s\n", ) // save utils if !.Global && .Utils { = []byte(generator.GenUtilsFile()) = os.WriteFile("states_utils.go", , 0666) if != nil { return } fmt.Println("Generated states_utils.go") } } else { return fmt.Errorf("file %s already exists, delete it or use --force", ) } return nil } func camelToSnake( string) string { := regexp.MustCompile("([a-z0-9])([A-Z])") := .ReplaceAllString(, "${1}_${2}") return strings.ToLower() } func fileExists( string) bool { , := os.Stat() if errors.Is(, os.ErrNotExist) { return false } return !.IsDir() }