import gleam/dynamic import gleam/json import gleam/string import json_serde import query_error.{type QueryError, QueryError} import tree import tree_events /// Parses a string query into corresponding TreeEvent /// /// Query formats: /// /// - get (path) /// - set (path) (data) pub fn parse(query: String) { let args = query |> string.split(" ") case args { ["get", path] -> { case path |> parse_path { Error(_) -> Error(QueryError("Wrong query format.")) Ok(#(head, tail)) -> #(head, fn(actor) { tree_events.GetEvent(tail, actor) }) |> Ok } } ["set", path, data] -> { case path |> parse_path { Error(_) -> Error(QueryError("Wrong query format.")) Ok(#(head, tail)) -> { let assert Ok(data) = data |> json.decode(dynamic.dynamic) let data = data |> json_serde.decode_leafdata case data { Error(_) -> Error(QueryError("Wrong data format.")) Ok(data) -> #(head, fn(actor) { tree_events.SetEvent(tail, data, actor) }) |> Ok } } } } _ -> Error(QueryError("Wrong query format.")) } } pub fn get(tree, path) -> Result(tree.Tree, QueryError) { let res = tree.get(tree, path) case res { Error(_) -> Error(QueryError("There is no such node.")) Ok(tree) -> Ok(tree) } } pub fn set(tree, path, data) -> Result(tree.Tree, QueryError) { Ok(tree.set(tree, path, data)) } pub fn parse_path(path) { case path |> string.split(".") { [head, ..tail] -> Ok(#(head, tail)) _ -> Error(QueryError("Bad path.")) } }