From 091ab9d412e0c9410a48ef92539e23a01bd94950 Mon Sep 17 00:00:00 2001
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Date: Thu, 19 Sep 2019 00:47:01 +0200
Subject: [PATCH] app: fix error messages for not specified parameters in
 argparse

Argparse module stores unspecified parameter values as boolean
true. It led to a problem, that a command line '--value' with
'value' defined as a number or a string, showed a strange error
message:

    Expected number/string, got "true"

Even though a user didn't pass any value. Now it shows 'nothing'
instead of '"true"'. That is clearer.

Follow up #4076

(cherry picked from commit c214d086f5d2519572ae05872a5e39796096315e)
---
 src/lua/argparse.lua                          | 27 +++++++++---------
 test/app/argparse.result                      |  4 +--
 ...h-4076-argparse-wrong-bool-handling.result | 28 ++++++++++++++++++-
 ...4076-argparse-wrong-bool-handling.test.lua | 12 ++++++++
 4 files changed, 55 insertions(+), 16 deletions(-)

diff --git a/src/lua/argparse.lua b/src/lua/argparse.lua
index 1471d58460..8dae388b1e 100644
--- a/src/lua/argparse.lua
+++ b/src/lua/argparse.lua
@@ -20,14 +20,21 @@ local function result_set_add(t_out, key, val)
     end
 end
 
+local function err_bad_parameter_value(name, got, expected)
+    if type(got) ~= 'string' then
+        got = 'nothing'
+    else
+        got = string.format('"%s"', got)
+    end
+    error(string.format('Bad value for parameter "%s". Expected %s, got %s',
+                        name, expected, got))
+end
+
 local function convert_parameter_simple(name, convert_from, convert_to)
     if convert_to == 'number' then
         local converted = tonumber(convert_from)
         if converted == nil then
-            error(
-                ('Bad value for parameter %s. expected type %s, got "%s"')
-                :format(name, convert_to, convert_from)
-            )
+            return err_bad_parameter_value(name, convert_from, convert_to)
         end
         return converted
     elseif convert_to == 'boolean' then
@@ -41,20 +48,14 @@ local function convert_parameter_simple(name, convert_from, convert_to)
         if convert_from == '1' or convert_from == 'true' then
             return true
         end
-        error(
-            ('Bad input for parameter "%s". Expected boolean, got "%s"')
-            :format(name, convert_from)
-        )
+        return err_bad_parameter_value(name, convert_from, convert_to)
     elseif convert_to == 'string' then
         if type(convert_from) ~= 'string' then
-            error(
-                ('Bad input for parameter "%s". Expected string, got "%s"')
-                :format(name, convert_from)
-            )
+            return err_bad_parameter_value(name, convert_from, convert_to)
         end
     else
         error(
-            ('Bad convertion format "%s" provided for %s')
+            ('Bad conversion format "%s" provided for %s')
             :format(convert_to, name)
         )
     end
diff --git a/test/app/argparse.result b/test/app/argparse.result
index d57693bc26..04f0439996 100644
--- a/test/app/argparse.result
+++ b/test/app/argparse.result
@@ -137,12 +137,12 @@ argparse({'--verh=42'}, {'verh'})
 ...
 argparse({'--verh=42'}, {{'verh', 'boolean'}})
 ---
-- error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "verh". Expected
+- error: 'builtin/internal.argparse.lua:<line>"]: Bad value for parameter "verh". Expected
     boolean, got "42"'
 ...
 argparse({'--verh=42'}, {{'verh', 'boolean+'}})
 ---
-- error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "verh". Expected
+- error: 'builtin/internal.argparse.lua:<line>"]: Bad value for parameter "verh". Expected
     boolean, got "42"'
 ...
 argparse({'--verh=42'}, {'niz'})
diff --git a/test/app/gh-4076-argparse-wrong-bool-handling.result b/test/app/gh-4076-argparse-wrong-bool-handling.result
index 91895b9ed9..fd933a37dc 100644
--- a/test/app/gh-4076-argparse-wrong-bool-handling.result
+++ b/test/app/gh-4076-argparse-wrong-bool-handling.result
@@ -48,10 +48,36 @@ args = {'--flag1', 'abc'}
  | ...
 argparse(args, params)
  | ---
- | - error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "flag1". Expected
+ | - error: 'builtin/internal.argparse.lua:<line>"]: Bad value for parameter "flag1". Expected
  |     boolean, got "abc"'
  | ...
 
+--
+-- When parameter value was omitted, it was replaced internally
+-- with boolean true, and sometimes was showed in error messages.
+-- Now it is 'nothing'.
+--
+params = {}
+ | ---
+ | ...
+params[1] = {'value', 'number'}
+ | ---
+ | ...
+argparse({'--value'}, params)
+ | ---
+ | - error: 'builtin/internal.argparse.lua:<line>"]: Bad value for parameter "value". Expected
+ |     number, got nothing'
+ | ...
+
+params[1][2] = 'string'
+ | ---
+ | ...
+argparse({'--value'}, params)
+ | ---
+ | - error: 'builtin/internal.argparse.lua:<line>"]: Bad value for parameter "value". Expected
+ |     string, got nothing'
+ | ...
+
 test_run:cmd("clear filter")
  | ---
  | - true
diff --git a/test/app/gh-4076-argparse-wrong-bool-handling.test.lua b/test/app/gh-4076-argparse-wrong-bool-handling.test.lua
index abd6c6927a..a8ee5e6703 100644
--- a/test/app/gh-4076-argparse-wrong-bool-handling.test.lua
+++ b/test/app/gh-4076-argparse-wrong-bool-handling.test.lua
@@ -17,4 +17,16 @@ argparse(args, params)
 args = {'--flag1', 'abc'}
 argparse(args, params)
 
+--
+-- When parameter value was omitted, it was replaced internally
+-- with boolean true, and sometimes was showed in error messages.
+-- Now it is 'nothing'.
+--
+params = {}
+params[1] = {'value', 'number'}
+argparse({'--value'}, params)
+
+params[1][2] = 'string'
+argparse({'--value'}, params)
+
 test_run:cmd("clear filter")
-- 
GitLab