summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2025-11-28 16:34:28 +0100
committerMarc Vertes <mvertes@free.fr>2025-11-28 16:34:28 +0100
commitfbc73922e9853d7e344e388f3fdfedb8fa323682 (patch)
tree17cab9c49babad09906a34f3c16ebb0558c4e948 /main.go
parent22b020225ae77ca1cf9f9984817df9b7fd1aaa12 (diff)
doc: improve comments, pass lint
Also improve the setup of golangci-lint.
Diffstat (limited to 'main.go')
-rw-r--r--main.go43
1 files changed, 11 insertions, 32 deletions
diff --git a/main.go b/main.go
index b0ca700..0e95bd4 100644
--- a/main.go
+++ b/main.go
@@ -1,12 +1,11 @@
+// The parscan command interprets programs.
package main
import (
"flag"
"fmt"
- "io"
"log"
"os"
- "strings"
"github.com/mvertes/parscan/interpreter"
"github.com/mvertes/parscan/lang/golang"
@@ -19,7 +18,7 @@ func main() {
}
}
-func run(arg []string) (err error) {
+func run(arg []string) error {
var str string
rflag := flag.NewFlagSet("run", flag.ContinueOnError)
rflag.Usage = func() {
@@ -28,46 +27,26 @@ func run(arg []string) (err error) {
rflag.PrintDefaults()
}
rflag.StringVar(&str, "e", "", "string to eval")
- if err = rflag.Parse(arg); err != nil {
+ if err := rflag.Parse(arg); err != nil {
return err
}
args := rflag.Args()
interp := interpreter.NewInterpreter(golang.GoSpec)
-
- var in io.Reader
if str != "" {
- in = strings.NewReader(str)
- } else {
- in = os.Stdin
- }
- if len(args) > 0 {
- if in, err = os.Open(arg[0]); err != nil {
- return err
- }
- if i2, ok := in.(io.ReadCloser); ok {
- defer i2.Close()
- }
+ return evalStr(interp, str)
}
-
- if isatty(in) {
- return interp.Repl(in)
+ if len(args) == 0 {
+ return interp.Repl(os.Stdin)
}
-
- buf, err := io.ReadAll(in)
+ buf, err := os.ReadFile(arg[0])
if err != nil {
return err
}
- _, err = interp.Eval(string(buf))
- return err
+ return evalStr(interp, string(buf))
}
-// isatty returns true if the input stream is a tty (i.e. a character device).
-func isatty(in io.Reader) bool {
- s, ok := in.(interface{ Stat() (os.FileInfo, error) })
- if !ok {
- return false
- }
- stat, err := s.Stat()
- return err == nil && stat.Mode()&os.ModeCharDevice != 0
+func evalStr(i *interpreter.Interp, s string) error {
+ _, err := i.Eval(s)
+ return err
}