From df740c0db405381ccea861b8212e4c07895c314b Mon Sep 17 00:00:00 2001 From: John Coene Date: Fri, 13 Sep 2024 23:12:44 +0200 Subject: [PATCH] feat: devtools cli closes #57 --- cli/cli.go | 55 +++++++++++++++++++++++++++---------------------- devtools/cli.go | 33 +++++++++++++++++++++++++++++ run.go | 7 +++++-- transpile.go | 30 +++++++++++++++------------ 4 files changed, 85 insertions(+), 40 deletions(-) create mode 100644 devtools/cli.go diff --git a/cli/cli.go b/cli/cli.go index c626054..1be327a 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -5,19 +5,20 @@ import ( ) type CLI struct { - Indir *string - Outdir *string - LSP *bool - TCP *bool - Port *string - Repl *bool - Help *bool - Version *bool - Check *bool - Run *bool - Types *string - Infile *string - Outfile *string + Indir *string + Outdir *string + LSP *bool + TCP *bool + Port *string + Repl *bool + Help *bool + Version *bool + Check *bool + Run *bool + Types *string + Infile *string + Outfile *string + Devtools *string } func Cli() CLI { @@ -47,20 +48,24 @@ func Cli() CLI { // version version := flag.Bool("version", false, "Retrieve vapour version") + // devtools + devtools := flag.String("devtools", "", "Run {devtools} functions after transpilation, accepts `document`, `check`, `install`, separate by comma (e.g.: `document,check`)") + flag.Parse() return CLI{ - Indir: indir, - Outdir: outdir, - LSP: lsp, - TCP: tcp, - Port: port, - Infile: infile, - Outfile: outfile, - Repl: repl, - Check: check, - Run: run, - Version: version, - Types: types, + Indir: indir, + Outdir: outdir, + LSP: lsp, + TCP: tcp, + Port: port, + Infile: infile, + Outfile: outfile, + Repl: repl, + Check: check, + Run: run, + Version: version, + Types: types, + Devtools: devtools, } } diff --git a/devtools/cli.go b/devtools/cli.go new file mode 100644 index 0000000..3ce0d37 --- /dev/null +++ b/devtools/cli.go @@ -0,0 +1,33 @@ +package devtools + +import ( + "fmt" + "strings" + + "github.com/devOpifex/vapour/cli" + "github.com/devOpifex/vapour/r" +) + +func Run(valid bool, args cli.CLI) { + if !valid { + return + } + + if *args.Devtools == "" { + return + } + + commands := strings.Split(*args.Devtools, ",") + + for _, c := range commands { + cmd := "devtools::" + c + "()" + out, err := r.Callr(cmd) + + if err != nil { + fmt.Println(err.Error()) + continue + } + + fmt.Println(string(out[:])) + } +} diff --git a/run.go b/run.go index 9fd6824..1b33128 100644 --- a/run.go +++ b/run.go @@ -8,6 +8,7 @@ import ( "github.com/devOpifex/vapour/cli" "github.com/devOpifex/vapour/config" + "github.com/devOpifex/vapour/devtools" "github.com/devOpifex/vapour/lsp" ) @@ -33,12 +34,14 @@ func (v *vapour) Run(args cli.CLI) { v.config = config.ReadConfig() if *args.Indir != "" { - v.transpile(args) + ok := v.transpile(args) + devtools.Run(ok, args) return } if *args.Infile != "" { - v.transpileFile(args) + ok := v.transpileFile(args) + devtools.Run(ok, args) return } diff --git a/transpile.go b/transpile.go index f8eea16..f14cb4a 100644 --- a/transpile.go +++ b/transpile.go @@ -11,7 +11,7 @@ import ( "github.com/devOpifex/vapour/walker" ) -func (v *vapour) transpile(conf cli.CLI) { +func (v *vapour) transpile(conf cli.CLI) bool { v.root = conf.Indir err := v.readDir() @@ -25,7 +25,7 @@ func (v *vapour) transpile(conf cli.CLI) { if l.HasError() { l.Errors().Print() - return + return false } // parse @@ -34,7 +34,7 @@ func (v *vapour) transpile(conf cli.CLI) { if p.HasError() { p.Errors().Print() - return + return false } // walk tree @@ -44,11 +44,11 @@ func (v *vapour) transpile(conf cli.CLI) { w.Errors().Print() if w.HasError() { - return + return false } if *conf.Check { - return + return false } // transpile @@ -58,7 +58,7 @@ func (v *vapour) transpile(conf cli.CLI) { if *conf.Run { run(code) - return + return false } code = addHeader(code) @@ -81,7 +81,7 @@ func (v *vapour) transpile(conf cli.CLI) { // we only generate types if it's an R package if *conf.Outdir != "R" { - return + return false } // write types @@ -99,9 +99,11 @@ func (v *vapour) transpile(conf cli.CLI) { if err != nil { log.Fatalf("Failed to write to types file: %v", err.Error()) } + + return true } -func (v *vapour) transpileFile(conf cli.CLI) { +func (v *vapour) transpileFile(conf cli.CLI) bool { content, err := os.ReadFile(*conf.Infile) if err != nil { @@ -114,7 +116,7 @@ func (v *vapour) transpileFile(conf cli.CLI) { if l.HasError() { l.Errors().Print() - return + return false } // parse @@ -123,7 +125,7 @@ func (v *vapour) transpileFile(conf cli.CLI) { if p.HasError() { p.Errors().Print() - return + return false } // walk tree @@ -131,11 +133,11 @@ func (v *vapour) transpileFile(conf cli.CLI) { w.Walk(prog) w.Errors().Print() if w.HasError() { - return + return false } if *conf.Check { - return + return false } // transpile @@ -145,7 +147,7 @@ func (v *vapour) transpileFile(conf cli.CLI) { if *conf.Run { run(code) - return + return false } code = addHeader(code) @@ -164,4 +166,6 @@ func (v *vapour) transpileFile(conf cli.CLI) { if err != nil { log.Fatal("Failed to write to output file") } + + return true }