treevault/src/query.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."))
}
}