aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2022-01-09 17:27:02 +0000
committerLouis Pilfold <louis@lpil.uk>2022-01-09 17:27:02 +0000
commit63b6a706c30cc5ee4084ccb9bce40f2f8159cdbb (patch)
tree015ad2690ecaa7e8e447394c78c335a5b0ed7fdb /src
parent24e4b166bcf441e2cefaf50f04282a7a3e516283 (diff)
downloadgleam_stdlib-63b6a706c30cc5ee4084ccb9bce40f2f8159cdbb.tar.gz
gleam_stdlib-63b6a706c30cc5ee4084ccb9bce40f2f8159cdbb.zip
decode3
Diffstat (limited to 'src')
-rw-r--r--src/gleam/dynamic.gleam34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam
index 4571b20..9aea340 100644
--- a/src/gleam/dynamic.gleam
+++ b/src/gleam/dynamic.gleam
@@ -910,6 +910,40 @@ pub fn decode2(
}
}
+/// Decode 3 values from a `Dynamic` value.
+///
+/// ## Examples
+///
+/// ```gleam
+/// > from(#(1, 2.0, "3"))
+/// > |> decode2(MyRecord, element(0, int), element(1, float), element(2, string))
+/// Ok(MyRecord(1, 2.0, "3"))
+/// ```
+///
+/// ```gleam
+/// > from(#("", "", ""))
+/// > |> decode2(MyRecord, element(0, int), element(1, float), element(2, string))
+/// Error([
+/// DecodeError(expected: "Int", found: "String", path: ["0"]),
+/// DecodeError(expected: "Float", found: "String", path: ["1"]),
+/// ])
+/// ```
+///
+pub fn decode3(
+ constructor: fn(t1, t2, t3) -> t,
+ decode1: Decoder(t1),
+ decode2: Decoder(t2),
+ decode3: Decoder(t3),
+) -> Decoder(t) {
+ fn(value) {
+ case decode1(value), decode2(value), decode3(value) {
+ Ok(a), Ok(b), Ok(c) -> Ok(constructor(a, b, c))
+ a, b, c ->
+ Error(list.flatten([all_errors(a), all_errors(b), all_errors(c)]))
+ }
+ }
+}
+
fn all_errors(result: Result(a, List(DecodeError))) -> List(DecodeError) {
case result {
Ok(_) -> []