diff --git a/src/treevault.gleam b/src/treevault.gleam index 3e079d5..c9ce3a1 100644 --- a/src/treevault.gleam +++ b/src/treevault.gleam @@ -3,35 +3,36 @@ import forest import gleam/bit_array import gleam/bytes_tree import gleam/dict -import gleam/erlang import gleam/erlang/process +import gleam/int import gleam/io -import gleam/list import gleam/option import gleam/otp/actor -import gleam/result import gleam/string import gleam_community/ansi import glisten import query import query_error import spinner -import tree_events pub fn main() { - let forest = init("./treevault.json") - - io.println( - "Hello from Treevault! 🌳\n - To exit gracefully, use \"exit\". - To list available commands, use \"help\". - ", - ) - read_next(forest) + init("./treevault.json") + process.sleep_forever() } pub fn init(config_path) { - let config = config.load(config_path) |> io.debug + io.println("🌳 Hello from Treevault! 🌳") + let spinner = + spinner.new("Loading configuration file...") + |> spinner.with_colour(ansi.pink) + |> spinner.start + let config = config.load(config_path) + spinner |> spinner.stop + + let spinner = + spinner.new("Loading trees...") + |> spinner.with_colour(ansi.pink) + |> spinner.start let forest = case forest.load(config.snapshots_path, config.forest) { Error(err) -> { let reason = err |> string.inspect @@ -39,7 +40,15 @@ pub fn init(config_path) { } Ok(forest) -> forest } + spinner |> spinner.stop + forest |> serve(config.port) + io.println( + "All set! Listening on port " <> config.port |> int.to_string <> ".", + ) +} + +fn serve(forest: forest.Forest, port: Int) { let assert Ok(_) = glisten.handler(fn(_conn) { #(Nil, option.None) }, fn(msg, state, conn) { let assert glisten.Packet(msg) = msg @@ -67,7 +76,7 @@ pub fn init(config_path) { } actor.continue(state) }) - |> glisten.serve(config.port) + |> glisten.serve(port) forest } @@ -85,79 +94,3 @@ fn run_query(forest: forest.Forest, root, evt) { } } } - -fn read_next(forest) { - let command = erlang.get_line("> ") - case command { - Error(err) -> { - err |> string.inspect |> io.println - read_next(forest) - } - - Ok(term) -> { - let term = term |> string.drop_end(1) - case term { - "exit" -> { - graceful(forest) - } - "help" -> { - "Available commands:" |> io.println - "help" |> io.println - "exit" |> io.println - "get " |> io.println - "set " |> io.println - "trees" |> io.println - - read_next(forest) - } - "trees" -> { - forest.trees |> dict.keys |> list.each(io.println) - read_next(forest) - } - _ -> { - case query.parse(term) { - Error(_) -> { - "Unknown command" |> io.println - } - Ok(#(root, evt)) -> { - let res = run_query(forest, root, evt) - res |> result.unwrap_both |> io.println - } - } - - read_next(forest) - } - } - } - } -} - -fn graceful(forest: forest.Forest) { - let spinner = - spinner.new("Shutting down...") - |> spinner.with_colour(ansi.pink) - |> spinner.start - - forest.trees - |> dict.to_list - |> list.each(fn(tree) { - let ps = tree.1.1 - let path = tree.1.0 - - { "Exiting: " <> tree.0 } |> io.println - let res = - ps - |> process.call_forever(fn(actor) { tree_events.Snapshot(path, actor) }) - case res { - Ok(ok) -> ok - Error(err) -> err - } - |> io.println - - ps |> process.send(tree_events.Shutdown) - }) - - process.sleep(1000) - "Bye" |> io.println - spinner |> spinner.stop -}