From 140b5a3e39237a855f6f8b64f70bda8c5377f7f3 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+ttytm@users.noreply.github.com> Date: Mon, 11 Sep 2023 05:26:34 +0200 Subject: [PATCH] toml: implement decode method for `Doc` (#19318) --- vlib/toml/tests/encode_and_decode_test.v | 46 +++++++++++++++++++++--- vlib/toml/toml.v | 10 ++++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/vlib/toml/tests/encode_and_decode_test.v b/vlib/toml/tests/encode_and_decode_test.v index 66e7192bf9..1e1ba3154b 100644 --- a/vlib/toml/tests/encode_and_decode_test.v +++ b/vlib/toml/tests/encode_and_decode_test.v @@ -178,12 +178,50 @@ times = [ assert toml.decode[Arrs](s)! == a } +fn test_decode_doc() { + doc := toml.parse_text('name = "Peter" +age = 28 +is_human = true +salary = 100000.5 +title = 2')! + e := doc.decode[Employee]()! + assert e.name == 'Peter' + assert e.age == 28 + assert e.salary == 100000.5 + assert e.is_human == true + assert e.title == .manager +} + fn test_unsupported_type() { s := 'name = "Peter"' err_msg := 'toml.decode: expected struct, found ' - toml.decode[string](s) or { assert err.msg() == err_msg + 'string' } - toml.decode[[]string](s) or { assert err.msg() == err_msg + '[]string' } - toml.decode[int](s) or { assert err.msg() == err_msg + 'int' } - toml.decode[[]f32](s) or { assert err.msg() == err_msg + '[]f32' } + if _ := toml.decode[string](s) { + assert false + } else { + assert err.msg() == err_msg + 'string' + } + if _ := toml.decode[[]string](s) { + assert false + } else { + assert err.msg() == err_msg + '[]string' + } + if _ := toml.decode[int](s) { + assert false + } else { + assert err.msg() == err_msg + 'int' + } + if _ := toml.decode[[]f32](s) { + assert false + } else { + assert err.msg() == err_msg + '[]f32' + } // ... + + doc := toml.parse_text('name = "Peter"')! + assert doc.value('name').string() == 'Peter' + if _ := doc.decode[string]() { + assert false + } else { + assert err.msg() == 'Doc.decode: expected struct, found string' + } } diff --git a/vlib/toml/toml.v b/vlib/toml/toml.v index fea73da731..a933591f6c 100644 --- a/vlib/toml/toml.v +++ b/vlib/toml/toml.v @@ -252,6 +252,16 @@ fn parse_array_key(key string) (string, int) { return k, index } +// decode decodes a TOML `string` into the target struct type `T`. +pub fn (d Doc) decode[T]() !T { + $if T !is $struct { + return error('Doc.decode: expected struct, found ${T.name}') + } + mut typ := T{} + decode_struct(d.to_any(), mut typ) + return typ +} + // to_any converts the `Doc` to toml.Any type. pub fn (d Doc) to_any() Any { return ast_to_any(d.ast.table)