diff options
author | kaiwu <kaiwu2004@gmail.com> | 2025-01-25 23:13:58 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2025-01-25 23:13:58 +0800 |
commit | cc9deefb51ea04441b276a2a3fe783c3eca99012 (patch) | |
tree | 0f88821294dfa51ed457bda1fbdcc42fa11304e0 | |
parent | e49fb431e7b17f091e2d4fda80095e401e76ebbf (diff) | |
download | glv8-cc9deefb51ea04441b276a2a3fe783c3eca99012.tar.gz glv8-cc9deefb51ea04441b276a2a3fe783c3eca99012.zip |
gleam update, bump versionv1.0.1
-rw-r--r-- | gleam.toml | 2 | ||||
-rw-r--r-- | manifest.toml | 8 | ||||
-rw-r--r-- | src/app/plv8.gleam | 23 | ||||
-rw-r--r-- | src/glv8.gleam | 4 | ||||
-rw-r--r-- | src/glv8/database.gleam | 16 | ||||
-rw-r--r-- | test/glv8/plv8_test.gleam | 12 |
6 files changed, 37 insertions, 28 deletions
@@ -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"))) } |