mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-01-26 06:22:50 -05:00
core: add dynamic completion for ipc command (#885)
This commit is contained in:
@@ -66,6 +66,10 @@ var ipcCmd = &cobra.Command{
|
|||||||
Short: "Send IPC commands to running DMS shell",
|
Short: "Send IPC commands to running DMS shell",
|
||||||
Long: "Send IPC commands to running DMS shell (qs -c dms ipc <args>)",
|
Long: "Send IPC commands to running DMS shell (qs -c dms ipc <args>)",
|
||||||
PreRunE: findConfig,
|
PreRunE: findConfig,
|
||||||
|
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||||
|
_ = findConfig(cmd, args)
|
||||||
|
return getShellIPCCompletions(args, toComplete), cobra.ShellCompDirectiveNoFileComp
|
||||||
|
},
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
runShellIPCCommand(args)
|
runShellIPCCommand(args)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import (
|
|||||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server"
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ipcTargets map[string][]string
|
||||||
|
|
||||||
var isSessionManaged bool
|
var isSessionManaged bool
|
||||||
|
|
||||||
func execDetachedRestart(targetPID int) {
|
func execDetachedRestart(targetPID int) {
|
||||||
@@ -68,7 +70,7 @@ func getPIDFilePath() string {
|
|||||||
|
|
||||||
func writePIDFile(childPID int) error {
|
func writePIDFile(childPID int) error {
|
||||||
pidFile := getPIDFilePath()
|
pidFile := getPIDFilePath()
|
||||||
return os.WriteFile(pidFile, []byte(strconv.Itoa(childPID)), 0644)
|
return os.WriteFile(pidFile, []byte(strconv.Itoa(childPID)), 0o644)
|
||||||
}
|
}
|
||||||
|
|
||||||
func removePIDFile() {
|
func removePIDFile() {
|
||||||
@@ -144,7 +146,7 @@ func runShellInteractive(session bool) {
|
|||||||
socketPath := server.GetSocketPath()
|
socketPath := server.GetSocketPath()
|
||||||
|
|
||||||
configStateFile := filepath.Join(getRuntimeDir(), "danklinux.path")
|
configStateFile := filepath.Join(getRuntimeDir(), "danklinux.path")
|
||||||
if err := os.WriteFile(configStateFile, []byte(configPath), 0644); err != nil {
|
if err := os.WriteFile(configStateFile, []byte(configPath), 0o644); err != nil {
|
||||||
log.Warnf("Failed to write config state file: %v", err)
|
log.Warnf("Failed to write config state file: %v", err)
|
||||||
}
|
}
|
||||||
defer os.Remove(configStateFile)
|
defer os.Remove(configStateFile)
|
||||||
@@ -370,7 +372,7 @@ func runShellDaemon(session bool) {
|
|||||||
socketPath := server.GetSocketPath()
|
socketPath := server.GetSocketPath()
|
||||||
|
|
||||||
configStateFile := filepath.Join(getRuntimeDir(), "danklinux.path")
|
configStateFile := filepath.Join(getRuntimeDir(), "danklinux.path")
|
||||||
if err := os.WriteFile(configStateFile, []byte(configPath), 0644); err != nil {
|
if err := os.WriteFile(configStateFile, []byte(configPath), 0o644); err != nil {
|
||||||
log.Warnf("Failed to write config state file: %v", err)
|
log.Warnf("Failed to write config state file: %v", err)
|
||||||
}
|
}
|
||||||
defer os.Remove(configStateFile)
|
defer os.Remove(configStateFile)
|
||||||
@@ -473,6 +475,51 @@ func runShellDaemon(session bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseTargetsFromIPCShowOutput(output string) ipcTargets {
|
||||||
|
targets := map[string][]string{}
|
||||||
|
var currentTarget string
|
||||||
|
for _, line := range strings.Split(output, "\n") {
|
||||||
|
if strings.HasPrefix(line, "target ") {
|
||||||
|
currentTarget = strings.TrimSpace(strings.TrimPrefix(line, "target "))
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(line, " function") && currentTarget != "" {
|
||||||
|
currentFunc := strings.TrimPrefix(line, " function ")
|
||||||
|
currentFunc = strings.SplitN(currentFunc, "(", 2)[0]
|
||||||
|
targets[currentTarget] = append(targets[currentTarget], currentFunc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return targets
|
||||||
|
}
|
||||||
|
|
||||||
|
func getShellIPCCompletions(args []string, toComplete string) []string {
|
||||||
|
cmdArgs := []string{"-p", configPath, "ipc", "show"}
|
||||||
|
cmd := exec.Command("qs", cmdArgs...)
|
||||||
|
var targets ipcTargets
|
||||||
|
|
||||||
|
if output, err := cmd.Output(); err == nil {
|
||||||
|
log.Debugf("IPC show output: %s", string(output))
|
||||||
|
targets = parseTargetsFromIPCShowOutput(string(output))
|
||||||
|
} else {
|
||||||
|
log.Debugf("Error getting IPC show output for completions: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) > 0 && args[0] == "call" {
|
||||||
|
args = args[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) == 0 {
|
||||||
|
targetNames := make([]string, 0)
|
||||||
|
targetNames = append(targetNames, "call")
|
||||||
|
for k := range targets {
|
||||||
|
targetNames = append(targetNames, k)
|
||||||
|
}
|
||||||
|
return targetNames
|
||||||
|
}
|
||||||
|
|
||||||
|
return targets[args[0]]
|
||||||
|
}
|
||||||
|
|
||||||
func runShellIPCCommand(args []string) {
|
func runShellIPCCommand(args []string) {
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
log.Error("IPC command requires arguments")
|
log.Error("IPC command requires arguments")
|
||||||
|
|||||||
Reference in New Issue
Block a user