cli: parse and resolve flags

Copy all flags from upstream. The machinectl flag is dropped as it does nothing. the flag package is used to reduce complexity since we do not care about compatibility with upstream.

Signed-off-by: Ophestra Umiker <cat@ophivana.moe>
This commit is contained in:
2024-07-09 15:39:40 +09:00
commit 491cc16d53
4 changed files with 107 additions and 0 deletions

67
cli.go Normal file
View File

@@ -0,0 +1,67 @@
package main
import (
"errors"
"flag"
"fmt"
"os"
"os/user"
)
var (
ego *user.User
command []string
verbose bool
method = machinectl
userName string
methodFlags [2]bool
printVersion bool
)
const (
machinectl uint8 = iota
machinectlBare
sudo
)
func init() {
flag.StringVar(&userName, "u", "ego", "Specify a username")
flag.BoolVar(&methodFlags[0], "sudo", false, "Use 'sudo' to change user")
flag.BoolVar(&methodFlags[1], "bare", false, "Use 'machinectl' but skip xdg-desktop-portal setup")
flag.BoolVar(&verbose, "v", false, "Verbose output")
flag.BoolVar(&printVersion, "V", false, "Print version")
}
func copyArgs() {
if printVersion {
fmt.Println(Version)
os.Exit(0)
}
command = flag.Args()
switch { // zero value is machinectl
case methodFlags[0]:
method = sudo
case methodFlags[1]:
method = machinectlBare
}
if u, err := user.Lookup(userName); err != nil {
if errors.As(err, new(user.UnknownUserError)) {
fmt.Println("unknown user", userName)
} else {
// unreachable
panic(err)
}
os.Exit(1)
} else {
ego = u
}
if verbose {
fmt.Println("Running command", command, "as user", ego.Username, "("+ego.Uid+")")
}
}