summaryrefslogtreecommitdiff
path: root/bash.orig.go
blob: 52920ebe83930b5e7c301586de8837fe216a45be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package prep

// initializes logging and command line options

import (
	"fmt"
	"os"
	"strings"

	"go.wit.com/dev/alexflint/arg"
	"go.wit.com/lib/gui/shell"
)

/*
This struct can be used with the go-arg package. These
are the generic default command line arguments for the 'GUI' package
*/
var argBash ArgsBash

type ArgsBash struct {
	Bash bool `arg:"--bash"                               help:"generate bash completion"`
}

// try this struct out (?)
var myAuto *AutoArgs

// this is a work in progress
type AutoArgs struct {
	id       int               // should be unique
	hidden   bool              // don't update the toolkits when it's hidden
	Auto     func([]string)    // the function for shell autocomplete
	appName  string            // a good way to track the name of the binary ?
	examples func() string     // some examples
	pp       *arg.Parser       // for parsing the command line args.  Yay to alexf lint!
	autoFunc func(*Auto)       // also a function for autocomplete
	match    map[string]string // maps for strings
}

// print out auto complete debugging info
func (pb *Auto) PrintDebug() {
	dur := pb.Duration.AsDuration()
	pb.Debugf("AUTOCOMPLETE: arg0='%s' arg1='%s' partial='%s' cmd='%s' age=%s argv=%v\n", pb.Arg0, pb.Arg1, pb.Partial, pb.Cmd, shell.FormatDuration(dur), pb.Argv)
}

func (pb *Auto) WriteHelp() {
	myAuto.pp.WriteHelp(os.Stdout)
}

func (pb *Auto) Debugf(fmts string, parts ...any) {
	fmts = strings.TrimSpace(fmts)
	fmts += "\n"
	// NOTE: env doesn't work probably most (all?) the time because bash
	// doesn't send all the ENV to autocomplete. so, trap on a "--autodebug" command line arg
	if os.Getenv("AUTOCOMPLETE_VERBOSE") == "true" || pb.Debug {
		if !pb.Newline {
			fmt.Fprintf(os.Stderr, "\n")
			pb.Newline = true
		}
		fmt.Fprintf(os.Stderr, fmts, parts...)
	} else {
		// fmt.Fprintf(os.Stderr, "NOT DOING ANYTHING\n")
	}
}

// returns the last command (is blank if the current arg is not blank)
func GetLast(cur string, argv []string) string {
	if cur != "''" {
		return ""
	}
	for _, s := range argv {
		if strings.HasPrefix(s, "-") {
			continue
		}
		return s
	}
	return ""
}

// returns the name of the executable registered for shell autocomplete
func AppName() string {
	return myAuto.appName
}

/*
// makes a bash autocomplete file for your command
func doBash(argname string) {
	fmt.Println(makeBashCompletionText(argname))

	homeDir, err := os.UserHomeDir()
	if err != nil {
		log.Printf("%v\n", err)
		os.Exit(0)
	}
	filename := filepath.Join(homeDir, ".local/share/bash-completion/completions", argname)
	if shell.Exists(filename) {
		log.Println(filename, "file already exists")
		os.Exit(0)
	}
	basedir, _ := filepath.Split(filename)
	if !shell.IsDir(basedir) {
		os.MkdirAll(basedir, os.ModePerm)
	}

	if f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err == nil {
		f.Write([]byte(makeBashCompletionText(argname)))
		f.Close()
		log.Println("bash file created:", filename)
		log.Println("restart bash")
	} else {
		log.Info(filename, err)
	}
	os.Exit(0)
}
*/

/*
// argname is the name of the executable
func Bash(argname string, autocomplete func([]string)) *AutoArgs {
	myAuto = new(AutoArgs)
	myAuto.appName = argname

	if len(os.Args) > 1 && os.Args[1] == "--bash" {
		doBash(argname)
		os.Exit(0)
	}

	if len(os.Args) > 1 && os.Args[1] == "--auto-complete" {
		autocomplete(os.Args[2:])
		os.Exit(0)
	}

	arg.Register(&argBash)

	// parse go.Arg here?
	return myAuto
}
*/