From db4d68eae75c071b2a6521fe8587102f5b781efe Mon Sep 17 00:00:00 2001 From: w0rp Date: Thu, 27 Jul 2017 00:06:15 +0100 Subject: [PATCH] Add a fuzzy JSON decoding function for ignoring json_decode errors for linters --- autoload/ale/util.vim | 20 ++++++++++++++++++++ test/test_fuzzy_json_decode.vader | 21 +++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 test/test_fuzzy_json_decode.vader diff --git a/autoload/ale/util.vim b/autoload/ale/util.vim index c86ac69..f314615 100644 --- a/autoload/ale/util.vim +++ b/autoload/ale/util.vim @@ -167,3 +167,23 @@ endfunction function! ale#util#EscapePCRE(unsafe_string) abort return substitute(a:unsafe_string, '\([\-\[\]{}()*+?.^$|]\)', '\\\1', 'g') endfunction + +" Given a String or a List of String values, try and decode the string(s) +" as a JSON value which can be decoded with json_decode. If the JSON string +" is invalid, the default argument value will be returned instead. +" +" This function is useful in code where the data can't be trusted to be valid +" JSON, and where throwing exceptions is mostly just irritating. +function! ale#util#FuzzyJSONDecode(data, default) abort + if empty(a:data) + return a:default + endif + + let l:str = type(a:data) == type('') ? a:data : join(a:data, '') + + try + return json_decode(l:str) + catch /E474/ + return a:default + endtry +endfunction diff --git a/test/test_fuzzy_json_decode.vader b/test/test_fuzzy_json_decode.vader new file mode 100644 index 0000000..4ac0ca1 --- /dev/null +++ b/test/test_fuzzy_json_decode.vader @@ -0,0 +1,21 @@ +Execute(FuzzyJSONDecode should return the default for empty Lists): + AssertEqual [], ale#util#FuzzyJSONDecode([], []) + AssertEqual {}, ale#util#FuzzyJSONDecode([], {}) + +Execute(FuzzyJSONDecode should return the default for empty Strings): + AssertEqual [], ale#util#FuzzyJSONDecode('', []) + AssertEqual {}, ale#util#FuzzyJSONDecode('', {}) + +Execute(FuzzyJSONDecode should return the default for Lists with invalid JSON): + AssertEqual [], ale#util#FuzzyJSONDecode(['x'], []) + AssertEqual {}, ale#util#FuzzyJSONDecode(['x'], {}) + +Execute(FuzzyJSONDecode should return the default for Strings with invalid JSON): + AssertEqual [], ale#util#FuzzyJSONDecode('x', []) + AssertEqual {}, ale#util#FuzzyJSONDecode('x', {}) + +Execute(FuzzyJSONDecode should return the JSON from the JSON string): + AssertEqual {'x': 3}, ale#util#FuzzyJSONDecode('{"x": 3}', []) + AssertEqual {'x': 3}, ale#util#FuzzyJSONDecode('{"x": 3}', {}) + AssertEqual {'x': 3}, ale#util#FuzzyJSONDecode(['{"x"', ': 3}'], []) + AssertEqual {'x': 3}, ale#util#FuzzyJSONDecode(['{"x"', ': 3}'], {})