summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/ale/util.vim20
-rw-r--r--test/test_fuzzy_json_decode.vader21
2 files changed, 41 insertions, 0 deletions
diff --git a/autoload/ale/util.vim b/autoload/ale/util.vim
index c86ac692..f3146151 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 00000000..4ac0ca1b
--- /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}'], {})