diff --git a/lua/spec/array_spec.lua b/lua/spec/array_spec.lua index dd1a18f2a6e..5bccdb5546d 100644 --- a/lua/spec/array_spec.lua +++ b/lua/spec/array_spec.lua @@ -322,6 +322,18 @@ describe('array', function() end) end) + describe('ParseMultiSelect', function() + it('check', function() + local a = {'test1', 'test2', 'test3'} + assert.are_same(a, Array.parseMultiSelect('test1, test2,test3')) + assert.are_same(a, Array.parseMultiSelect('test1 - test2-test3', '-')) + assert.are_same(a, Array.parseMultiSelect('["test1", "test2", "test3"]')) + assert.error(function () + return Array.parseMultiSelect('{"a":"test1","b":"test2","c":"test3"}') + end) + end) + end) + describe('Interleave', function () it('works', function() assert.are_same({'a', ' ', 'b', ' ', 'c'}, Array.interleave({'a', 'b', 'c'}, ' ')) diff --git a/lua/wikis/commons/Array.lua b/lua/wikis/commons/Array.lua index b91664e7d32..00618a55b3b 100644 --- a/lua/wikis/commons/Array.lua +++ b/lua/wikis/commons/Array.lua @@ -5,6 +5,7 @@ -- Please see https://github.com/Liquipedia/Lua-Modules to contribute -- +local Json = require('Module:Json') local Logic = require('Module:Logic') local Set = require('Module:Set') local String = require('Module:StringUtils') @@ -791,4 +792,21 @@ function Array.interleave(elements, x) return ret end +---@param inputString string? +---@param sep string? +---@return string[] +---@nodiscard +function Array.parseMultiSelect(inputString, sep) + local parsed = Json.parseIfTable(inputString) + + if not parsed then + return Array.parseCommaSeparatedString(inputString, sep) + end + + -- validate it actually is an array + assert(Array.isArray(parsed), '"inputString" could not be parsed to an array') + + return parsed +end + return Array diff --git a/lua/wikis/commons/MatchTable.lua b/lua/wikis/commons/MatchTable.lua index d2154d8bc21..1b2deb5857f 100644 --- a/lua/wikis/commons/MatchTable.lua +++ b/lua/wikis/commons/MatchTable.lua @@ -404,7 +404,7 @@ function MatchTable:buildAdditionalConditions() local getOrCondition = function(lpdbKey, input) if Logic.isEmpty(input) then return end - conditions:add(ConditionUtil.anyOf(ColumnName(lpdbKey), Array.parseCommaSeparatedString(input))) + conditions:add(ConditionUtil.anyOf(ColumnName(lpdbKey), Array.parseMultiSelect(input))) end getOrCondition('liquipediatier', args.tier) diff --git a/lua/wikis/commons/ResultsTable/Base.lua b/lua/wikis/commons/ResultsTable/Base.lua index bf39e4c5008..1ef4074b3ab 100644 --- a/lua/wikis/commons/ResultsTable/Base.lua +++ b/lua/wikis/commons/ResultsTable/Base.lua @@ -255,7 +255,7 @@ function BaseResultsTable:buildBaseConditions() if args.tier then conditions:add( - ConditionUtil.anyOf(ColumnName('liquipediatier'), Array.parseCommaSeparatedString(args.tier)) + ConditionUtil.anyOf(ColumnName('liquipediatier'), Array.parseMultiSelect(args.tier)) ) end