63 lines
1.6 KiB
Gleam
63 lines
1.6 KiB
Gleam
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."))
|
|
}
|
|
}
|