114 lines
2.4 KiB
Go
114 lines
2.4 KiB
Go
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// options.go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
|
|
"git.portale-stac.it/go-pkg/expr"
|
|
"git.portale-stac.it/go-pkg/utils"
|
|
)
|
|
|
|
type Options struct {
|
|
printTree bool
|
|
printPrefix bool
|
|
forceInteractive bool
|
|
builtin []any
|
|
expressions []io.Reader
|
|
formOpt expr.FmtOpt
|
|
baseVerb string
|
|
base int
|
|
output bool
|
|
rcCount int
|
|
}
|
|
|
|
func NewOptions() *Options {
|
|
return &Options{
|
|
expressions: make([]io.Reader, 0),
|
|
builtin: make([]any, 0),
|
|
formOpt: expr.Base10,
|
|
baseVerb: "%d",
|
|
base: 10,
|
|
output: true,
|
|
rcCount: 0,
|
|
}
|
|
}
|
|
|
|
func (opt *Options) loadRc() {
|
|
var rcPath string
|
|
var fh *os.File
|
|
var err error
|
|
if rcPath, err = utils.ExpandPath("~/.dev-expr.rc"); err != nil {
|
|
return
|
|
}
|
|
if fh, err = os.Open(rcPath); err == nil {
|
|
opt.expressions = append(opt.expressions, fh)
|
|
opt.rcCount++
|
|
}
|
|
}
|
|
|
|
func (opt *Options) parseArgs() (err error) {
|
|
for i := 1; i < len(os.Args) && err == nil; i++ {
|
|
arg := os.Args[i]
|
|
switch arg {
|
|
case "-i":
|
|
opt.forceInteractive = true
|
|
case "-t":
|
|
opt.printTree = true
|
|
case "-p":
|
|
opt.printPrefix = true
|
|
case "-e":
|
|
if i+1 < len(os.Args) {
|
|
i++
|
|
spec := os.Args[i]
|
|
if strings.HasPrefix(spec, "@") {
|
|
var f *os.File
|
|
if f, err = os.Open(spec[1:]); err == nil {
|
|
opt.expressions = append(opt.expressions, f)
|
|
} else {
|
|
return
|
|
}
|
|
} else {
|
|
opt.expressions = append(opt.expressions, strings.NewReader(spec))
|
|
}
|
|
} else {
|
|
err = errOptValueRequired(arg)
|
|
}
|
|
case "-b":
|
|
if i+1 < len(os.Args) {
|
|
i++
|
|
specs := strings.Split(os.Args[i], ",")
|
|
if len(specs) == 1 {
|
|
opt.builtin = append(opt.builtin, specs[0])
|
|
} else {
|
|
opt.builtin = append(opt.builtin, specs)
|
|
}
|
|
} else {
|
|
err = errOptValueRequired(arg)
|
|
}
|
|
case "-m", "--modules":
|
|
expr.IterateBuiltinModules(func(name, description string, _ bool) bool {
|
|
fmt.Printf("%20q: %s\n", name, description)
|
|
return true
|
|
})
|
|
os.Exit(0)
|
|
case "--noout":
|
|
opt.output = false
|
|
case "-h", "--help", "help":
|
|
cmdHandler.help()
|
|
os.Exit(0)
|
|
case "-v", "--version", "version", "about":
|
|
fmt.Println(about())
|
|
os.Exit(0)
|
|
default:
|
|
err = fmt.Errorf("invalid option nr %d %q", i+1, arg)
|
|
}
|
|
}
|
|
return
|
|
}
|