removed cli for the good

This commit is contained in:
Ivan Yuriev 2025-02-17 21:40:18 +03:00
parent a64acafbc9
commit b47bff55af

View File

@ -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 <path>" |> io.println
"set <path> <data>" |> 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
}