From 1d12f46d2cbea664450fcec13bf47829992993ee Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Sat, 29 Nov 2025 15:06:24 +0100 Subject: [PATCH] Use `logger` --- src/musicplayer.gleam | 6 +++++- src/musicplayer/mpv/mpv.gleam | 2 +- src/musicplayer/musicplayer.gleam | 33 +++++++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/musicplayer.gleam b/src/musicplayer.gleam index 69d9bf5..3fd6635 100644 --- a/src/musicplayer.gleam +++ b/src/musicplayer.gleam @@ -2,17 +2,21 @@ import gleam/erlang/process.{type Name} import musicplayer/input/input import musicplayer/input/key.{type Key} +import musicplayer/logging/logging import musicplayer/mpv/mpv import musicplayer/musicplayer import musicplayer/ui/ui pub fn main() -> Nil { + let assert Ok(logger) = logging.new("/tmp/musicplayer.log") + let input_keys_name: Name(Key) = process.new_name("input_keys") input.new(input_keys_name) let assert Ok(ui) = ui.new() let assert Ok(mpv) = mpv.new() - let assert Ok(musicplayer_pid) = musicplayer.new(ui, mpv, input_keys_name) + let assert Ok(musicplayer_pid) = + musicplayer.new(logger, ui, mpv, input_keys_name) let monitor = process.monitor(musicplayer_pid) process.new_selector() diff --git a/src/musicplayer/mpv/mpv.gleam b/src/musicplayer/mpv/mpv.gleam index 73f4e27..7e38ad6 100644 --- a/src/musicplayer/mpv/mpv.gleam +++ b/src/musicplayer/mpv/mpv.gleam @@ -24,7 +24,7 @@ pub fn new() -> Result(Subject(Control), String) { |> actor.start { Error(start_error) -> - Error("Could not start actor: " <> string.inspect(start_error)) + Error("Could not start mpv: " <> string.inspect(start_error)) Ok(actor.Started(data: mpv, ..)) -> Ok(mpv) } } diff --git a/src/musicplayer/musicplayer.gleam b/src/musicplayer/musicplayer.gleam index f81e75f..65c8bfa 100644 --- a/src/musicplayer/musicplayer.gleam +++ b/src/musicplayer/musicplayer.gleam @@ -2,11 +2,13 @@ import gleam/erlang/process.{type Name, type Pid, type Subject} import gleam/otp/actor import gleam/result import gleam/string -import musicplayer/time/time import musicplayer/control.{type Control} import musicplayer/input/key.{type Key} +import musicplayer/logging/control as logging_control +import musicplayer/logging/logging import musicplayer/mpv/control as mpv_control +import musicplayer/time/time import musicplayer/ui/control as ui_control import musicplayer/ui/layout @@ -23,12 +25,14 @@ type State { State( mode: Mode, input: Input, + logger: Subject(logging_control.Control), ui: Subject(ui_control.Control), mpv: Subject(mpv_control.Control), ) } pub fn new( + logger: Subject(logging_control.Control), ui: Subject(ui_control.Control), mpv: Subject(mpv_control.Control), input_keys_name: Name(Key), @@ -38,13 +42,14 @@ pub fn new( let input = Input(False, "") case - actor.new(State(Idle, input, ui, mpv)) + actor.new(State(Idle, input, logger, ui, mpv)) |> actor.on_message(handle_message) |> actor.start { Error(start_error) -> Error("Could not start actor: " <> string.inspect(start_error)) Ok(actor.Started(pid:, data: musicplayer)) -> { + logging.log(logger, "musicplayer - started") process.spawn(fn() { let assert Ok(_) = process.register(process.self(), input_keys_name) handle_key(musicplayer, input_keys) @@ -60,6 +65,8 @@ pub fn new( fn handle_message(state: State, control: Control) -> actor.Next(State, Control) { case control { control.Search -> { + logging.log(state.logger, "musicplayer - initiating search") + update_search(state.ui, "searching: ") actor.continue( @@ -72,6 +79,8 @@ fn handle_message(state: State, control: Control) -> actor.Next(State, Control) } control.Raw(content) -> { + logging.log(state.logger, "musicplayer - recieved raw input: " <> content) + let content = case state.mode { Idle -> state.input.content Searching -> { @@ -84,6 +93,8 @@ fn handle_message(state: State, control: Control) -> actor.Next(State, Control) actor.continue(State(..state, input: Input(..state.input, content:))) } control.Backspace -> { + logging.log(state.logger, "musicplayer - recieved backspace") + let content = case state.mode { Idle -> state.input.content Searching -> string.drop_end(state.input.content, 1) @@ -91,6 +102,14 @@ fn handle_message(state: State, control: Control) -> actor.Next(State, Control) actor.continue(State(..state, input: Input(..state.input, content:))) } control.Return -> { + logging.log( + state.logger, + "musicplayer - recieved return. `input.capture`: " + <> "'" + <> state.input.content + <> "'", + ) + // Note: state.input.content is now the final input, use it // before it is reset case state.mode { @@ -104,17 +123,27 @@ fn handle_message(state: State, control: Control) -> actor.Next(State, Control) } control.TogglePlayPause -> { + logging.log(state.logger, "musicplayer - toggling play/pause") + process.send(state.mpv, mpv_control.TogglePlayPause) update_playback_time(state.mpv, state.ui) actor.continue(state) } control.Exit -> { + logging.log(state.logger, "musicplayer - initiating musicplayer shutdown") // Close `mpv` socket process.call(state.mpv, 1000, fn(reply_to) { mpv_control.Exit(reply_to) }) // Reset terminal state (show cursor etc.) process.call(state.ui, 1000, fn(reply_to) { ui_control.Exit(reply_to) }) + logging.log(state.logger, "musicplayer - stopped") + + // Close logger (NOOP) + process.call(state.logger, 1000, fn(reply_to) { + logging_control.Exit(reply_to) + }) + actor.stop() } }