diff options
-rw-r--r-- | src/glv8.gleam | 2 | ||||
-rw-r--r-- | src/glv8/database.gleam | 79 |
2 files changed, 79 insertions, 2 deletions
diff --git a/src/glv8.gleam b/src/glv8.gleam index 0ea4b51..0b039e3 100644 --- a/src/glv8.gleam +++ b/src/glv8.gleam @@ -1,9 +1,11 @@ +import gleam/dynamic.{type DecodeErrors} import gleam/json.{type Json} pub type DBError { DBError(Nil) DBErrorMessage(e: String) DBErrorJson(j: Json) + DBErrorDecode(es: DecodeErrors) } pub type Function0 = diff --git a/src/glv8/database.gleam b/src/glv8/database.gleam index d4bdce7..5fb7783 100644 --- a/src/glv8/database.gleam +++ b/src/glv8/database.gleam @@ -1,6 +1,6 @@ -// import gleam/dynamic -// import gleam/result +import gleam/dynamic.{type DecodeErrors, type Dynamic} import gleam/javascript/array.{type Array} +import gleam/result import glv8.{type DBError} pub type Row { @@ -30,6 +30,33 @@ pub fn execute(query q: String, parameters p: p) -> Result(Array(Row), DBError) /// /// /// +pub fn decode( + rows rs: Array(Row), + decoder f: fn(Dynamic) -> Result(a, DecodeErrors), +) -> Result(Array(a), DBError) { + rs + |> array.to_list + |> dynamic.from + |> dynamic.list(of: f) + |> result.map(array.from_list(_)) + |> result.map_error(glv8.DBErrorDecode(_)) +} + +/// +/// +/// +pub fn execute_as( + query q: String, + parameters p: p, + of f: fn(Dynamic) -> Result(a, DecodeErrors), +) -> Result(Array(a), DBError) { + execute(q, p) + |> result.try(decode(_, f)) +} + +/// +/// +/// @external(javascript, "../glv8_ffi.mjs", "prepare") pub fn prepare(query q: String, paremeters p: Array(String)) -> PreparedPlan @@ -45,6 +72,18 @@ pub fn plan_execute( /// /// /// +pub fn plan_execute_as( + plan pl: PreparedPlan, + parameters p: p, + of f: fn(Dynamic) -> Result(a, DecodeErrors), +) -> Result(Array(a), DBError) { + plan_execute(pl, p) + |> result.try(decode(_, f)) +} + +/// +/// +/// @external(javascript, "../glv8_ffi.mjs", "plan_free") pub fn plan_free(plan pl: PreparedPlan) -> Nil @@ -63,6 +102,30 @@ pub fn cursor_fetch(cursor c: Cursor) -> Result(Row, DBError) /// /// /// +pub fn decode0( + row r: Row, + decoder f: fn(Dynamic) -> Result(a, DecodeErrors), +) -> Result(a, DBError) { + r + |> dynamic.from + |> f + |> result.map_error(glv8.DBErrorDecode(_)) +} + +/// +/// +/// +pub fn cursor_fetch_as( + cursor c: Cursor, + of f: fn(Dynamic) -> Result(a, DecodeErrors), +) -> Result(a, DBError) { + cursor_fetch(c) + |> result.try(decode0(_, f)) +} + +/// +/// +/// @external(javascript, "../glv8_ffi.mjs", "cursor_fetch_rows") pub fn cursor_fetch_rows( cursor c: Cursor, @@ -72,6 +135,18 @@ pub fn cursor_fetch_rows( /// /// /// +pub fn cursor_fetch_rows_as( + cursor c: Cursor, + rows n: Int, + of f: fn(Dynamic) -> Result(a, DecodeErrors), +) -> Result(Array(a), DBError) { + cursor_fetch_rows(c, n) + |> result.try(decode(_, f)) +} + +/// +/// +/// @external(javascript, "../glv8_ffi.mjs", "cursor_move") pub fn cursor_move(cursor c: Cursor, rows n: Int) -> Nil |