diff options
-rw-r--r-- | lib/gitano/lace.lua | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/lib/gitano/lace.lua b/lib/gitano/lace.lua index 4927e1c..926d49e 100644 --- a/lib/gitano/lace.lua +++ b/lib/gitano/lace.lua @@ -44,46 +44,46 @@ local function _loader(ctx, _name) return real_name, tree[blob_name].obj.content end -local matchers = {} +local match_types = { + exact = function(want, have) + return want == have + end, + pattern = function(want, have) + return (have:match(want) ~= nil) + end +} + +do + local inverted_matches = {} + for k, v in pairs(match_types) do + inverted_matches["!" .. k] = function(...) return not v(...) end + end + for k, v in pairs(inverted_matches) do + match_types[k] = v + end +end local function _do_simple_match(ctx, key, matchtype, value) value = util.process_expansion(ctx, value) - local inv = matchtype:sub(1,1) == "!" - if inv then - matchtype = matchtype:sub(2) - end - local pat = (matchtype == "pattern") and value local kk = ctx[key] or "" - local function check(v) - if pat then - if inv then - return (v:match(pat) == nil) - else - return (v:match(pat) ~= nil) - end - end - if inv then - return v ~= value - end - return v == value - end + local check = match_types[matchtype] if type(kk) == "function" then -- Realise the value first ctx[key] = kk(ctx) kk = ctx[key] end if type(kk) == "string" then - return check(kk) + return check(value, kk) else if pat and kk[1] ~= nil then for i = 1, #kk do - if check(kk[i]) then + if check(value, kk[i]) then return true end end return false else - if inv then + if matchtype:sub(1,1) == "!" then return kk[value] == nil end return kk[value] ~= nil @@ -114,6 +114,9 @@ local function _simple_match(ctx, key, matchtype, value, guard) matchtype = matchtype .. "exact" end end + if match_types[matchtype] == nil then + return lace.compiler.error("Unknown match type", {2}) + end return { fn = _do_simple_match, args = { key, matchtype, util.prep_expansion(value) } @@ -138,6 +141,8 @@ local simples = { "member/prefix", "member/suffix", } +local matchers = {} + for _, s in ipairs(simples) do matchers[s] = _simple_match end |