package main import ( "flag" "fmt" "io" "os" "github.com/alecthomas/chroma/v2/quick" "go.jolheiser.com/chromajson" "go.jolheiser.com/chromajson/schema" ) func main() { fs := flag.NewFlagSet("chromajson", flag.ExitOnError) styleFlag := fs.String("style", ".style.json", "Chroma JSON style config") lintFlag := fs.Bool("lint", false, "Lint config and exit") if err := fs.Parse(os.Args[1:]); err != nil { fmt.Println(err) return } if !*lintFlag && fs.NArg() == 0 { fmt.Println("input argument is required to show style") return } fi, err := os.Open(*styleFlag) if err != nil { fmt.Println(err) return } defer fi.Close() if *lintFlag { lint(fi) return } style, err := chromajson.LoadStyle(fi) if err != nil { fmt.Println(err) return } if err := style.Register(); err != nil { fmt.Println(err) return } source, err := os.ReadFile(fs.Arg(0)) if err != nil { fmt.Println(err) return } if err := quick.Highlight(fs.Output(), string(source), "", "terminal256", style.Name); err != nil { fmt.Println(err) return } } func lint(r io.Reader) { ok, err := schema.Lint(r) if ok { fmt.Println("✅ Config is valid!") return } fmt.Printf("❌ Config is invalid: %v\n", err) rerrs, ok := err.(schema.ResultErrors) if !ok { fmt.Println(err) return } for _, rerr := range rerrs { fmt.Printf("In %s: %s\n", rerr.Field(), rerr.Description()) } }