Files
dim-cli/v2/dimcli.go
T
2025-12-22 15:01:23 +01:00

108 lines
1.7 KiB
Go

package dimcli
import (
"fmt"
"os"
"slices"
"strconv"
)
type Cli struct {
Args []string
Help bool
Indentation int
}
func NewCli() Cli {
var cli = Cli{
Args: os.Args[1:],
Indentation: 0,
}
cli.Help = cli.Flag("-h") || cli.Flag("--help")
return cli
}
func (c *Cli) Command(name string) bool {
if (c.Help) {
c.printIndentation()
fmt.Printf("[ cmd ] %v\n", name)
}
if len(c.Args) == 0 {
return false
}
if c.Args[0] == name {
c.Args = c.Args[1:]
c.Indentation++
return true
}
return false
}
func (c Cli) Flag(name string) bool {
if c.Help {
c.printIndentation()
fmt.Printf("[ flg ] %v\n", name)
return false
}
return slices.Contains(c.Args, name)
}
func (c Cli) printIndentation() {
for range c.Indentation {
fmt.Printf("\t")
}
}
func (c Cli) String(name string) (string, error) {
if c.Help {
c.printIndentation()
fmt.Printf("[ str ] %v\n", name)
return "", nil
}
var index int
for i, arg := range c.Args {
index = i+1
if name == arg {
break
}
}
if len(c.Args) <= index {
return "", fmt.Errorf("No value provided after %v", name)
}
return c.Args[index], nil
}
func (c Cli) Int(name string) (int64, error) {
if c.Help {
c.printIndentation()
fmt.Printf("[ int ] %v\n", name)
return 0, nil
}
s, err := c.String(name)
if err != nil {
return 0, err
}
i, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return 0, err
}
return i, nil
}
func (c Cli) Float(name string) (float64, error) {
if c.Help {
c.printIndentation()
fmt.Printf("[ flt ] %v\n", name)
return 0, nil
}
s, err := c.String(name)
if err != nil {
return 0, err
}
f, err := strconv.ParseFloat(s, 64)
if err != nil {
return 0, err
}
return f, nil
}