diff --git a/bin/main.ml b/bin/main.ml index 35f6d9b..7e7720c 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -6,5 +6,6 @@ let () = let s = State.create Sys.argv.(1) in Printf.printf "Loaded %d lines\n" (State.size s); + Repl.help (); Repl.loop s diff --git a/lib/repl.ml b/lib/repl.ml index 597ee68..cf8a62c 100644 --- a/lib/repl.ml +++ b/lib/repl.ml @@ -1,15 +1,43 @@ +type command = { description : string; run : State.t -> State.t } + +module Cmd = Map.Make (String) + +let commands = + [ + ( "next", + { description = "Move cursor to the next log line"; run = State.next } ); + ( "prev", + { description = "Move cursor to the previous line"; run = State.prev } ); + ( "show", + { + description = "Display the current log line"; + run = + (fun s -> + Printf.printf "[%d]: %s\n" (State.cursor s) (State.show_line s); + s); + } ); + ] + |> List.to_seq |> Cmd.of_seq + +let help () = + Printf.printf "Available commands:\n"; + Cmd.iter + (fun cmd args -> Printf.printf " %-11s %s\n" cmd args.description) + commands; + print_endline " exit, quit Exit the inspector" + let rec loop state = print_string "inspector> "; flush stdout; try - match read_line () |> String.lowercase_ascii with + let cmd = read_line () |> String.lowercase_ascii in + match cmd with + | "" -> loop state | "exit" | "quit" -> print_endline "bye" - | "next" -> loop (State.next state) - | "prev" -> loop (State.prev state) - | "show" -> - Printf.printf "[%d]: %s\n" (State.cursor state) (State.show_line state); - loop state - | str -> - print_endline str; - loop state + | _ -> ( + match Cmd.find_opt cmd commands with + | Some c -> loop (c.run state) + | None -> + Printf.printf "Unknown command: %s\n" cmd; + loop state) with End_of_file -> print_endline "bye" diff --git a/lib/repl.mli b/lib/repl.mli index cc32f76..6ac8394 100644 --- a/lib/repl.mli +++ b/lib/repl.mli @@ -19,3 +19,6 @@ val loop : State.t -> unit the loop. The function runs until the user exits the program. *) + +val help : unit -> unit +(** [help] print all commands available in the repl. *)