package main import ( "context" "fmt" "os" "os/exec" "path/filepath" "time" ) func requireST() error { if _, err := exec.LookPath("st"); err != nil { return fmt.Errorf("st is required for wayland discussion") } return nil } func requireNvim() error { if _, err := exec.LookPath("nvim"); err != nil { return fmt.Errorf("nvim is required for wayland discussion") } return nil } func runDiscussionWayland(ctx context.Context, text string) error { if err := requireST(); err != nil { return err } if err := requireNvim(); err != nil { return err } if _, err := exec.LookPath("swaymsg"); err != nil { return fmt.Errorf("swaymsg is required for wayland discussion") } tmpPath, cleanup, err := makeAFDTempFile(text) if err != nil { return err } defer cleanup() cmd := exec.CommandContext(ctx, "st", "-n", "scratch", "-e", "nvim", tmpPath) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Start(); err != nil { return err } time.Sleep(150 * time.Millisecond) _ = exec.CommandContext(ctx, "swaymsg", "[instance=\"scratch\"]", "move", "to", "scratchpad").Run() _ = exec.CommandContext(ctx, "swaymsg", "[instance=\"scratch\"]", "scratchpad", "show").Run() err = cmd.Wait() return err } func makeAFDTempFile(text string) (string, func(), error) { base := os.Getenv("XDG_CACHE_HOME") if base == "" { base = os.TempDir() } dir := filepath.Join(base, "weather") if err := os.MkdirAll(dir, 0o755); err != nil { return "", nil, err } file, err := os.CreateTemp(dir, "afd-*.md") if err != nil { return "", nil, err } path := file.Name() if _, err := file.WriteString(text); err != nil { _ = file.Close() _ = os.Remove(path) return "", nil, err } if err := file.Close(); err != nil { _ = os.Remove(path) return "", nil, err } cleanup := func() { _ = os.Remove(path) } return path, cleanup, nil }