80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
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())
|
|
}
|
|
}
|