mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
121 lines
2.6 KiB
Go
121 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/github/linguist/tools/grammars/compiler"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
func cwd() string {
|
|
cwd, _ := os.Getwd()
|
|
return cwd
|
|
}
|
|
|
|
func wrap(err error) error {
|
|
return cli.NewExitError(err, 255)
|
|
}
|
|
|
|
func main() {
|
|
app := cli.NewApp()
|
|
app.Name = "Linguist Grammars Compiler"
|
|
app.Usage = "Compile user-submitted grammars and check them for errors"
|
|
|
|
app.Flags = []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "linguist-path",
|
|
Value: cwd(),
|
|
Usage: "path to Linguist root",
|
|
},
|
|
}
|
|
|
|
app.Commands = []cli.Command{
|
|
{
|
|
Name: "add",
|
|
Usage: "add a new grammar source",
|
|
Flags: []cli.Flag{
|
|
cli.BoolFlag{
|
|
Name: "force, f",
|
|
Usage: "ignore compilation errors",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
conv, err := compiler.NewConverter(c.String("linguist-path"))
|
|
if err != nil {
|
|
return wrap(err)
|
|
}
|
|
if err := conv.AddGrammar(c.Args().First()); err != nil {
|
|
if !c.Bool("force") {
|
|
return wrap(err)
|
|
}
|
|
}
|
|
if err := conv.WriteGrammarList(); err != nil {
|
|
return wrap(err)
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
Name: "update",
|
|
Usage: "update grammars.yml with the contents of the grammars library",
|
|
Flags: []cli.Flag{
|
|
cli.BoolFlag{
|
|
Name: "force, f",
|
|
Usage: "write grammars.yml even if grammars fail to compile",
|
|
},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
conv, err := compiler.NewConverter(c.String("linguist-path"))
|
|
if err != nil {
|
|
return wrap(err)
|
|
}
|
|
if err := conv.ConvertGrammars(true); err != nil {
|
|
return wrap(err)
|
|
}
|
|
if err := conv.Report(); err != nil {
|
|
if !c.Bool("force") {
|
|
return wrap(err)
|
|
}
|
|
}
|
|
if err := conv.WriteGrammarList(); err != nil {
|
|
return wrap(err)
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
Name: "compile",
|
|
Usage: "convert the grammars from the library",
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{Name: "proto-out, P"},
|
|
cli.StringFlag{Name: "out, o"},
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
conv, err := compiler.NewConverter(c.String("linguist-path"))
|
|
if err != nil {
|
|
return cli.NewExitError(err, 1)
|
|
}
|
|
if err := conv.ConvertGrammars(false); err != nil {
|
|
return cli.NewExitError(err, 1)
|
|
}
|
|
if out := c.String("proto-out"); out != "" {
|
|
if err := conv.WriteProto(out); err != nil {
|
|
return cli.NewExitError(err, 1)
|
|
}
|
|
}
|
|
if out := c.String("out"); out != "" {
|
|
if err := conv.WriteJSON(out); err != nil {
|
|
return cli.NewExitError(err, 1)
|
|
}
|
|
}
|
|
if err := conv.Report(); err != nil {
|
|
return wrap(err)
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
}
|
|
|
|
app.Run(os.Args)
|
|
}
|