From 49b193e76a9988dbae54f604fc567c6f3af8ecbd Mon Sep 17 00:00:00 2001 From: dwrz Date: Mon, 26 Oct 2026 02:37:19 +0000 Subject: [PATCH] Add wen cmd --- cmd/wen/main.go | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 cmd/wen/main.go diff --git a/cmd/wen/main.go b/cmd/wen/main.go new file mode 100644 index 0000000..e4531a1 --- /dev/null +++ b/cmd/wen/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "context" + "fmt" + "log/slog" + "os" + "os/signal" + "path/filepath" + "syscall" + + "code.chimeric.al/dwrz/wen/internal/editor" + "code.chimeric.al/dwrz/wen/pkg/terminal" +) + +func main() { + var log = slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ + AddSource: true, + Level: slog.LevelDebug, + })) + + // Setup the main context. + // The context cancels on SIGINT or SIGTERM. + ctx, stop := signal.NotifyContext( + context.Background(), + syscall.SIGINT, + syscall.SIGTERM, + ) + defer stop() + + if err := run(ctx); err != nil { + log.Error("failed", slog.Any("error", err)) + os.Exit(1) + } +} + +func run(ctx context.Context) error { + // Setup workspace and log file. + cdir, err := os.UserCacheDir() + if err != nil { + return fmt.Errorf( + "failed to determine user cache directory: %w", err, + ) + } + wdir := filepath.Join(cdir, "wen") + + if err := os.MkdirAll(wdir, os.ModeDir|0700); err != nil { + return fmt.Errorf("failed to create tmp dir: %w", err) + } + + f, err := os.Create(wdir + "/log") + if err != nil { + return fmt.Errorf("failed to create log file: %w", err) + } + defer f.Close() + + var editorLog = slog.New(slog.NewTextHandler(f, &slog.HandlerOptions{ + AddSource: true, + Level: slog.LevelDebug, + })) + + // Retrieve terminal info. + t, err := terminal.New(os.Stdin.Fd()) + if err != nil { + return fmt.Errorf("failed to get terminal attributes: %w", err) + } + + // Create the editor. + editor, err := editor.New(editor.Parameters{ + In: os.Stdin, + Log: editorLog, + Out: os.Stdout, + TempDir: wdir, + Terminal: t, + }) + if err != nil { + return fmt.Errorf("failed to create editor: %w", err) + } + + // Run the editor. + return editor.Run(ctx, os.Args[1:]) +}