Refactor life cmd
This commit is contained in:
+13
-20
@@ -22,20 +22,29 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
var log = slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
|
var log = slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
|
||||||
AddSource: true,
|
AddSource: true,
|
||||||
Level: slog.LevelDebug,
|
Level: slog.LevelDebug,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
if err := run(log); err != nil {
|
// 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, log); err != nil {
|
||||||
log.Error("failed", slog.Any("error", err))
|
log.Error("failed", slog.Any("error", err))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func run(log *slog.Logger) error {
|
func run(ctx context.Context, log *slog.Logger) error {
|
||||||
// Parse flags.
|
|
||||||
flag.Parse()
|
|
||||||
if *height < 0 {
|
if *height < 0 {
|
||||||
return fmt.Errorf("invalid height: %d", *height)
|
return fmt.Errorf("invalid height: %d", *height)
|
||||||
}
|
}
|
||||||
@@ -46,10 +55,6 @@ func run(log *slog.Logger) error {
|
|||||||
return fmt.Errorf("invalid tick: %d", *tick)
|
return fmt.Errorf("invalid tick: %d", *tick)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup the main context.
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
// Setup workspace and log file.
|
// Setup workspace and log file.
|
||||||
cdir, err := os.UserCacheDir()
|
cdir, err := os.UserCacheDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -92,18 +97,6 @@ func run(log *slog.Logger) error {
|
|||||||
width = &cols
|
width = &cols
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: refactor; handle sigwinch.
|
|
||||||
go func() {
|
|
||||||
var signals = make(chan os.Signal, 1)
|
|
||||||
signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT)
|
|
||||||
|
|
||||||
// Block until we receive a signal.
|
|
||||||
s := <-signals
|
|
||||||
log.Debug("received signal", slog.Any("signal", s))
|
|
||||||
|
|
||||||
cancel()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Setup the game.
|
// Setup the game.
|
||||||
var game = life.New(life.Parameters{
|
var game = life.New(life.Parameters{
|
||||||
Height: *height,
|
Height: *height,
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ func (l *Life) Run(ctx context.Context) error {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// Main loop.
|
// Main loop.
|
||||||
|
// TODO: handle sigwinch; resize the world on terminal resize.
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
|||||||
Reference in New Issue
Block a user