aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/receipt.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-08 18:34:38 +0200
committerGitHub <noreply@github.com>2022-07-08 18:34:38 +0200
commit976aa4fbee8a070f362cab6f6ec84e9251a90cf9 (patch)
tree5e8d9c9c59444a25c7801b8f39763c4ba6e1f76d /lua/mason-core/receipt.lua
parentfeat: add gotests, gomodifytags, impl (#28) (diff)
downloadmason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.gz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.bz2
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.lz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.xz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.zst
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.zip
refactor: add mason-schemas and mason-core modules (#29)
* refactor: add mason-schemas and move generated filetype map to mason-lspconfig * refactor: add mason-core module
Diffstat (limited to 'lua/mason-core/receipt.lua')
-rw-r--r--lua/mason-core/receipt.lua180
1 files changed, 180 insertions, 0 deletions
diff --git a/lua/mason-core/receipt.lua b/lua/mason-core/receipt.lua
new file mode 100644
index 00000000..76cd7449
--- /dev/null
+++ b/lua/mason-core/receipt.lua
@@ -0,0 +1,180 @@
+local M = {}
+
+---@alias InstallReceiptSchemaVersion
+---| '"1.0"'
+
+---@alias InstallReceiptSourceType
+---| '"npm"'
+---| '"pip3"'
+---| '"gem"'
+---| '"go"'
+---| '"cargo"'
+---| '"opam"'
+---| '"dotnet"'
+---| '"r_package"'
+---| '"unmanaged"'
+---| '"system"'
+---| '"jdtls"'
+---| '"git"'
+---| '"github_tag"'
+---| '"github_release"'
+---| '"github_release_file"'
+
+---@alias InstallReceiptSource {type: InstallReceiptSourceType}
+
+---@class InstallReceiptLinks
+---@field bin table<string, string>
+
+---@class InstallReceiptBuilder
+---@field private secondary_sources InstallReceiptSource[]
+---@field private links InstallReceiptLinks
+---@field private epoch_time number
+local InstallReceiptBuilder = {}
+InstallReceiptBuilder.__index = InstallReceiptBuilder
+
+function InstallReceiptBuilder.new()
+ return setmetatable({
+ secondary_sources = {},
+ links = {
+ bin = vim.empty_dict(),
+ },
+ }, InstallReceiptBuilder)
+end
+
+---@param name string
+function InstallReceiptBuilder:with_name(name)
+ self.name = name
+ return self
+end
+
+---@param version InstallReceiptSchemaVersion
+function InstallReceiptBuilder:with_schema_version(version)
+ self.schema_version = version
+ return self
+end
+
+---@param source InstallReceiptSource
+function InstallReceiptBuilder:with_primary_source(source)
+ self.primary_source = source
+ return self
+end
+
+---@param source InstallReceiptSource
+function InstallReceiptBuilder:with_secondary_source(source)
+ table.insert(self.secondary_sources, source)
+ return self
+end
+
+---@param typ '"bin"'
+---@param name string
+---@param rel_path string
+function InstallReceiptBuilder:with_link(typ, name, rel_path)
+ assert(not self.links[typ][name], ("%s/%s has already been linked."):format(typ, name))
+ self.links[typ][name] = rel_path
+ return self
+end
+
+---@param seconds integer
+---@param microseconds integer
+local function to_ms(seconds, microseconds)
+ return (seconds * 1000) + math.floor(microseconds / 1000)
+end
+
+---vim.loop.gettimeofday()
+---@param seconds integer
+---@param microseconds integer
+function InstallReceiptBuilder:with_completion_time(seconds, microseconds)
+ self.completion_time = to_ms(seconds, microseconds)
+ return self
+end
+
+---vim.loop.gettimeofday()
+---@param seconds integer
+---@param microseconds integer
+function InstallReceiptBuilder:with_start_time(seconds, microseconds)
+ self.start_time = to_ms(seconds, microseconds)
+ return self
+end
+
+function InstallReceiptBuilder:build()
+ assert(self.name, "name is required")
+ assert(self.schema_version, "schema_version is required")
+ assert(self.start_time, "start_time is required")
+ assert(self.completion_time, "completion_time is required")
+ assert(self.primary_source, "primary_source is required")
+ return {
+ name = self.name,
+ schema_version = self.schema_version,
+ metrics = {
+ start_time = self.start_time,
+ completion_time = self.completion_time,
+ },
+ primary_source = self.primary_source,
+ secondary_sources = self.secondary_sources,
+ links = self.links,
+ }
+end
+
+---@param type InstallReceiptSourceType
+local function package_source(type)
+ ---@param pkg string
+ return function(pkg)
+ return { type = type, package = pkg }
+ end
+end
+
+InstallReceiptBuilder.npm = package_source "npm"
+InstallReceiptBuilder.pip3 = package_source "pip3"
+InstallReceiptBuilder.gem = package_source "gem"
+InstallReceiptBuilder.go = package_source "go"
+InstallReceiptBuilder.dotnet = package_source "dotnet"
+InstallReceiptBuilder.cargo = package_source "cargo"
+InstallReceiptBuilder.composer = package_source "composer"
+InstallReceiptBuilder.r_package = package_source "r_package"
+InstallReceiptBuilder.opam = package_source "opam"
+InstallReceiptBuilder.luarocks = package_source "luarocks"
+
+InstallReceiptBuilder.unmanaged = { type = "unmanaged" }
+
+---@param repo string
+---@param release string
+function InstallReceiptBuilder.github_release(repo, release)
+ return {
+ type = "github_release",
+ repo = repo,
+ release = release,
+ }
+end
+
+---@param dependency string
+function InstallReceiptBuilder.system(dependency)
+ return { type = "system", dependency = dependency }
+end
+
+---@param remote_url string
+function InstallReceiptBuilder.git_remote(remote_url)
+ return { type = "git", remote = remote_url }
+end
+
+---@class InstallReceipt
+---@field public name string
+---@field public schema_version InstallReceiptSchemaVersion
+---@field public metrics {start_time:integer, completion_time:integer}
+---@field public primary_source InstallReceiptSource
+---@field public secondary_sources InstallReceiptSource[]
+---@field public links InstallReceiptLinks
+local InstallReceipt = {}
+InstallReceipt.__index = InstallReceipt
+
+function InstallReceipt.new(props)
+ return setmetatable(props, InstallReceipt)
+end
+
+function InstallReceipt.from_json(json)
+ return InstallReceipt.new(json)
+end
+
+M.InstallReceiptBuilder = InstallReceiptBuilder
+M.InstallReceipt = InstallReceipt
+
+return M