summaryrefslogtreecommitdiff
path: root/src/luarocks/results.lua
blob: c14862de7af8e22b91ffc91a37ca607dd53d5b53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
local results = {}

local vers = require("luarocks.core.vers")
local util = require("luarocks.util")

local result_mt = {}

result_mt.__index = result_mt

function result_mt.type()
   return "result"
end

function results.new(name, version, repo, arch, namespace)
   assert(type(name) == "string" and not name:match("/"))
   assert(type(version) == "string")
   assert(type(repo) == "string")
   assert(type(arch) == "string" or not arch)
   assert(type(namespace) == "string" or not namespace)

   if not namespace then
      name, namespace = util.split_namespace(name)
   end

   local self = {
      name = name,
      version = version,
      namespace = namespace,
      arch = arch,
      repo = repo,
   }

   return setmetatable(self, result_mt)
end

--- Test the name field of a query.
-- If query has a boolean field substring set to true,
-- then substring match is performed; otherwise, exact string
-- comparison is done.
-- @param query table: A query in dependency table format.
-- @param name string: A package name.
-- @return boolean: True if names match, false otherwise.
local function match_name(query, name)
   if query.substring then
      return name:find(query.name, 0, true) and true or false
   else
      return name == query.name
   end
end

--- Returns true if the result satisfies a given query.
-- @param query: a query.
-- @return boolean.
function result_mt:satisfies(query)
   assert(query:type() == "query")
   return match_name(query, self.name)
      and (query.arch[self.arch] or query.arch["any"])
      and ((not query.namespace) or (query.namespace == self.namespace))
      and vers.match_constraints(vers.parse_version(self.version), query.constraints)
end

return results