aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2025-01-25 23:13:58 +0800
committerkaiwu <kaiwu2004@gmail.com>2025-01-25 23:13:58 +0800
commitcc9deefb51ea04441b276a2a3fe783c3eca99012 (patch)
tree0f88821294dfa51ed457bda1fbdcc42fa11304e0
parente49fb431e7b17f091e2d4fda80095e401e76ebbf (diff)
downloadglv8-cc9deefb51ea04441b276a2a3fe783c3eca99012.tar.gz
glv8-cc9deefb51ea04441b276a2a3fe783c3eca99012.zip
gleam update, bump versionv1.0.1
-rw-r--r--gleam.toml2
-rw-r--r--manifest.toml8
-rw-r--r--src/app/plv8.gleam23
-rw-r--r--src/glv8.gleam4
-rw-r--r--src/glv8/database.gleam16
-rw-r--r--test/glv8/plv8_test.gleam12
6 files changed, 37 insertions, 28 deletions
diff --git a/gleam.toml b/gleam.toml
index 00aab5a..7835a91 100644
--- a/gleam.toml
+++ b/gleam.toml
@@ -1,5 +1,5 @@
name = "glv8"
-version = "1.0.0"
+version = "1.0.1"
description = "Write functional type-safe postgresql procedures with gleam, through plv8's JavaScript binding"
target = "javascript"
diff --git a/manifest.toml b/manifest.toml
index 9c7f6e5..77d7cf0 100644
--- a/manifest.toml
+++ b/manifest.toml
@@ -2,10 +2,10 @@
# You typically do not need to edit this file
packages = [
- { name = "envoy", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "CFAACCCFC47654F7E8B75E614746ED924C65BD08B1DE21101548AC314A8B6A41" },
- { name = "gleam_javascript", version = "0.12.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "6EB652538B31E852FE0A8307A8B6314DEB34930944B6DDC41CCC31CA344DA35D" },
- { name = "gleam_json", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "CB10B0E7BF44282FB25162F1A24C1A025F6B93E777CCF238C4017E4EEF2CDE97" },
- { name = "gleam_stdlib", version = "0.40.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "86606B75A600BBD05E539EB59FABC6E307EEEA7B1E5865AFB6D980A93BCB2181" },
+ { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" },
+ { name = "gleam_javascript", version = "0.13.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "F98328FCF573DA6F3A35D7F6CB3F9FF19FD5224CCBA9151FCBEAA0B983AF2F58" },
+ { name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" },
+ { name = "gleam_stdlib", version = "0.53.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "53F3E1E56F692C20FA3E0A23650AC46592464E40D8EF3EC7F364FB328E73CDF5" },
{ name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" },
]
diff --git a/src/app/plv8.gleam b/src/app/plv8.gleam
index c2da8fe..02afb3e 100644
--- a/src/app/plv8.gleam
+++ b/src/app/plv8.gleam
@@ -2,7 +2,7 @@
////
import gleam/bool
-import gleam/dynamic
+import gleam/dynamic/decode
import gleam/javascript/array.{type Array}
import gleam/json
import gleam/list
@@ -43,7 +43,7 @@ pub fn catch_sql_error() -> Nil {
}
pub fn catch_sql_error2() -> String {
- let rs = database.execute_as("throw SQL error", Nil, dynamic.string)
+ let rs = database.execute_as("throw SQL error", Nil, decode.string)
let fold = fn(rx) { array.fold(rx, "", string.append) }
use <- bool.guard(
@@ -54,10 +54,14 @@ pub fn catch_sql_error2() -> String {
rs
|> result.try_recover(fn(e) {
let _ = elog_notice(e |> glv8.error_to_string)
+ let decoder = {
+ use value <- decode.field("t", decode.string)
+ decode.success(value)
+ }
database.execute_as(
"select 'and execute queries again' t",
Nil,
- dynamic.field("t", dynamic.string),
+ decoder,
)
})
|> result.map(fold)
@@ -87,16 +91,15 @@ pub fn fastsum(arr: Array(Int)) -> Int {
}
pub fn return_sql() -> Array(Rec) {
- let decode =
- dynamic.decode2(
- Rec,
- dynamic.field("i", dynamic.int),
- dynamic.field("t", dynamic.string),
- )
+ let decoder = {
+ use i <- decode.field("i", decode.int)
+ use t <- decode.field("t", decode.string)
+ decode.success(Rec(i: i, t: t))
+ }
database.execute_as(
"SELECT i, $1 || i AS t FROM generate_series(1, $2) as tt(i)",
#("s", 4),
- decode,
+ decoder,
)
|> result.unwrap([] |> array.from_list)
}
diff --git a/src/glv8.gleam b/src/glv8.gleam
index 43447a9..ef15408 100644
--- a/src/glv8.gleam
+++ b/src/glv8.gleam
@@ -1,7 +1,9 @@
-import gleam/dynamic.{type DecodeErrors}
+import gleam/dynamic/decode.{type DecodeError}
import gleam/json.{type Json}
import gleam/list
+pub type DecodeErrors = List(DecodeError)
+
pub type JsObject {
JsObject
}
diff --git a/src/glv8/database.gleam b/src/glv8/database.gleam
index 68b7a8f..86a0d01 100644
--- a/src/glv8/database.gleam
+++ b/src/glv8/database.gleam
@@ -1,7 +1,8 @@
-import gleam/dynamic.{type DecodeErrors, type Dynamic}
+import gleam/dynamic.{type Dynamic}
import gleam/javascript/array.{type Array}
+import gleam/dynamic/decode.{type Decoder}
import gleam/result
-import glv8.{type DBError}
+import glv8.{type DBError, type DecodeErrors}
pub type Row {
Row
@@ -12,6 +13,7 @@ pub type PreparedPlan
pub type Cursor
+
pub type SubTransaction =
fn() -> Nil
@@ -61,12 +63,12 @@ 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),
+ decoder f: Decoder(a),
) -> Result(Array(a), DBError) {
rs
|> array.to_list
|> dynamic.from
- |> dynamic.list(of: f)
+ |> decode.run(decode.list(f))
|> result.map(array.from_list(_))
|> result.map_error(glv8.DBErrorDecode(_))
}
@@ -77,7 +79,7 @@ pub fn decode(
pub fn execute_as(
query q: String,
parameters p: p,
- of f: fn(Dynamic) -> Result(a, DecodeErrors),
+ of f: Decoder(a),
) -> Result(Array(a), DBError) {
execute(q, p)
|> result.try(decode(_, f))
@@ -104,7 +106,7 @@ pub fn plan_execute(
pub fn plan_execute_as(
plan pl: PreparedPlan,
parameters p: p,
- of f: fn(Dynamic) -> Result(a, DecodeErrors),
+ of f: Decoder(a),
) -> Result(Array(a), DBError) {
plan_execute(pl, p)
|> result.try(decode(_, f))
@@ -167,7 +169,7 @@ pub fn cursor_fetch_rows(
pub fn cursor_fetch_rows_as(
cursor c: Cursor,
rows n: Int,
- of f: fn(Dynamic) -> Result(a, DecodeErrors),
+ of f: Decoder(a),
) -> Result(Array(a), DBError) {
cursor_fetch_rows(c, n)
|> result.try(decode(_, f))
diff --git a/test/glv8/plv8_test.gleam b/test/glv8/plv8_test.gleam
index 13304b3..f4aa2d3 100644
--- a/test/glv8/plv8_test.gleam
+++ b/test/glv8/plv8_test.gleam
@@ -1,6 +1,7 @@
import app/plv8
import bundle
import gleam/dynamic
+import gleam/dynamic/decode
import gleam/javascript
import gleam/result
import gleeunit/should
@@ -17,13 +18,14 @@ pub fn object_test() {
}
pub fn rec_test() {
+ let decoder = {
+ use i <- decode.field("i", decode.int)
+ use t <- decode.field("t", decode.string)
+ decode.success(plv8.Rec(i:i, t:t))
+ }
plv8.scalar_to_record(42, "hi")
|> dynamic.from
- |> dynamic.decode2(
- plv8.Rec,
- dynamic.field("i", dynamic.int),
- dynamic.field("t", dynamic.string),
- )
+ |> decode.run(decoder)
|> should.equal(Ok(plv8.Rec(42, "hi")))
}