From: Oleg Babin <olegrok@tarantool.org>
To: Alexander Turenko <alexander.turenko@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH v2] error: Add __concat method to error object
Date: Fri, 10 Jan 2020 18:51:30 +0300 [thread overview]
Message-ID: <5c9365fc-0e7f-4363-2a17-9449cf45eaec@tarantool.org> (raw)
In-Reply-To: <20200110123205.fu5kg376hxcq2n2f@tkn_work_nb>
Thanks for your review!
As we discussed verbally I improve test and consider cases of tables and
ffi objects
We will not overcomplicate logic with proper error message construction:
user will see "attempt to concatenate ''type' and ''string''' "
On 10/01/2020 15:32, Alexander Turenko wrote:
> On Mon, Nov 11, 2019 at 05:50:09PM +0300, Oleg Babin wrote:
>> From: Oleg Babin <babinoleg@mail.ru>
>>
>> Usually functions return pair {nil, err} and expected that err is string.
>> Let's make the behaviour of error object closer to string
>> and define __concat metamethod.
>>
>> Closes #4489
>> ---
>>
>> Changes in v2:
>> - Added tests
>>
>> ---
>> src/lua/error.lua | 8 +++++++
>> test/box/misc.result | 47 +++++++++++++++++++++++++++++++++++++++++-
>> test/box/misc.test.lua | 17 ++++++++++++++-
>> 3 files changed, 70 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/lua/error.lua b/src/lua/error.lua
>> index 28fc0377d..b44fab7b6 100644
>> --- a/src/lua/error.lua
>> +++ b/src/lua/error.lua
>> @@ -150,9 +150,17 @@ local function error_index(err, key)
>> return error_methods[key]
>> end
>>
>> +local function error_concat(lhs, rhs)
>> + if lhs == nil or rhs == nil then
>> + error("attempt to concatenate struct error and nil")
> Nit: If we want to follow string concatenation errors, then it should be
> 'struct error and nil' or 'nil and struct error' depending of what
> values lhs and rhs have. See below possible resolution.
>
>> + end
>> + return tostring(lhs) .. tostring(rhs)
>> +end
>> +
>> local error_mt = {
>> __index = error_index;
>> __tostring = error_message;
>> + __concat = error_concat;
>> };
>>
>> ffi.metatype('struct error', error_mt);
> It is the same as
> https://github.com/tarantool/tarantool/issues/4489#issuecomment-530448023
>
> I'll cite my answer from this issue:
>
> | I would say that it should not allow more then a string: say,
> | `'' .. box.NULL` gives an error, so
> | `box.error.new(box.error.CFG, 'foo', 'bar') .. box.NULL` should too.
> | At the first glance it looks that we should allow only an error as
> | the first argument and a string, a number or an error as the second
> | one.
> |
> | I think it is harmless, so I'm okay in general.
>
> Yep, the example with box.NULL works correct with your implementation.
> But not with ffi.new('char'). Not even with {}.
>
> Also I was a bit out of context and don't know that a metamethod of a
> right value can be invoked if there are no metamethod in a left one. So
> 'we should allow only an error as the first argument' is not correct:
> the first and the seconds arguments should be symmetric.
>
> To sum up I propose to follow logic of concatenation operation of a
> string: it allows only certain data types to be concatenated with it:
> strings and numbers.
>
> We maybe can reuse string's checks:
>
> | if lhs is an error:
> | return tostring(lhs) .. rhs
> | else if rhs is an error:
> | return lhs .. tostring(rhs)
> | else:
> | return error('error_mt.__concat(): neither of args is an error')
>
> Here we handle everything as I see: nils, tables (with and without its
> own __concat), numbers, cdata and userdata (again, with and without
> __concat).
>
> Anyway, let's test an implementation more carefully.
>
> The only flaw I see that if a concatenation error occurs, then it will
> state an error of concatenate a string with something (or something with
> a string) rather then struct error.
>
> WBR, Alexander Turenko.
next prev parent reply other threads:[~2020-01-10 15:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-11 14:50 Oleg Babin
2020-01-10 12:32 ` Alexander Turenko
2020-01-10 15:51 ` Oleg Babin [this message]
2020-01-10 14:51 ` Sergey Ostanevich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5c9365fc-0e7f-4363-2a17-9449cf45eaec@tarantool.org \
--to=olegrok@tarantool.org \
--cc=alexander.turenko@tarantool.org \
--cc=tarantool-patches@dev.tarantool.org \
--subject='Re: [Tarantool-patches] [PATCH v2] error: Add __concat method to error object' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox