Files
wen/cmd/wen/main.go
T
2026-10-26 02:37:19 +00:00

83 lines
1.7 KiB
Go

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:])
}