aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/glv8.gleam2
-rw-r--r--src/glv8/database.gleam79
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