// 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 (states-file, grafana)\n" + .Description()) } switch { case .StatesFile != nil: if := genStatesFile(, .StatesFile); != nil { fmt.Println() os.Exit(1) } case .Grafana != nil: .Grafana.Token = os.Getenv(EnvGrafanaToken) if := genGrafana(, .Grafana); != nil { fmt.Println() os.Exit(1) } } } 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.StatesParams) error { := fmt.Sprintf("ss_%s.go", camelToSnake(.Name)) if !fileExists() || .Force { // generate , := generator.NewSchemaGenerator(, *) if != nil { return } // save ss_ := []byte(.Output()) = os.WriteFile(, , 0666) if != nil { return } fmt.Printf("Generated %s\n", ) // save 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() }