aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/core/receipt.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-01-03 15:12:53 +0100
committerGitHub <noreply@github.com>2022-01-03 15:12:53 +0100
commite8530f4059279a0d6b5e5f8891d04ffb1ade29a3 (patch)
treeb90ddf4479314af49e1eca3325262ef45e5f630d /lua/nvim-lsp-installer/core/receipt.lua
parenthealth: add neovim version check (diff)
downloadmason-e8530f4059279a0d6b5e5f8891d04ffb1ade29a3.tar
mason-e8530f4059279a0d6b5e5f8891d04ffb1ade29a3.tar.gz
mason-e8530f4059279a0d6b5e5f8891d04ffb1ade29a3.tar.bz2
mason-e8530f4059279a0d6b5e5f8891d04ffb1ade29a3.tar.lz
mason-e8530f4059279a0d6b5e5f8891d04ffb1ade29a3.tar.xz
mason-e8530f4059279a0d6b5e5f8891d04ffb1ade29a3.tar.zst
mason-e8530f4059279a0d6b5e5f8891d04ffb1ade29a3.zip
write install receipts (#379)
Diffstat (limited to 'lua/nvim-lsp-installer/core/receipt.lua')
-rw-r--r--lua/nvim-lsp-installer/core/receipt.lua134
1 files changed, 134 insertions, 0 deletions
diff --git a/lua/nvim-lsp-installer/core/receipt.lua b/lua/nvim-lsp-installer/core/receipt.lua
new file mode 100644
index 00000000..5808dfeb
--- /dev/null
+++ b/lua/nvim-lsp-installer/core/receipt.lua
@@ -0,0 +1,134 @@
+local M = {}
+
+---@alias InstallerReceiptSource table
+
+---@class InstallReceiptBuilder
+---@field private secondary_sources InstallerReceiptSource[]
+---@field private epoch_time number
+local InstallReceiptBuilder = {}
+InstallReceiptBuilder.__index = InstallReceiptBuilder
+
+function InstallReceiptBuilder.new()
+ return setmetatable({
+ secondary_sources = {},
+ }, InstallReceiptBuilder)
+end
+
+---@param name string
+function InstallReceiptBuilder:with_name(name)
+ self.name = name
+ return self
+end
+
+---@alias InstallerReceiptSchemaVersion
+---| '"1.0"'
+
+---@param version InstallerReceiptSchemaVersion
+function InstallReceiptBuilder:with_schema_version(version)
+ self.schema_version = version
+ return self
+end
+
+---@param source InstallerReceiptSource
+function InstallReceiptBuilder:with_primary_source(source)
+ self.primary_source = source
+ return self
+end
+
+---@param source InstallerReceiptSource
+function InstallReceiptBuilder:with_secondary_source(source)
+ table.insert(self.secondary_sources, source)
+ 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,
+ }
+end
+
+---@param type string
+local function package_source(type)
+ ---@param package string
+ return function(package)
+ return { type = type, package = package }
+ 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.unmanaged = { type = "unmanaged" }
+
+---@param dependency string
+function InstallReceiptBuilder.system(dependency)
+ return { type = "system", dependency = dependency }
+end
+
+---@param remote_url string
+---@param revision string
+function InstallReceiptBuilder.git_remote(remote_url, revision)
+ return { type = "git", remote = remote_url, revision = revision }
+end
+
+---@param ctx ServerInstallContext
+---@param opts UseGithubReleaseOpts|nil
+function InstallReceiptBuilder.github_release_file(ctx, opts)
+ opts = opts or {}
+ return {
+ type = "github_release_file",
+ repo = ctx.github_repo,
+ file = ctx.github_release_file,
+ release = ctx.requested_server_version,
+ tag_name_pattern = opts.tag_name_pattern,
+ }
+end
+
+function InstallReceiptBuilder.github_tag(ctx)
+ return {
+ type = "github_tag",
+ repo = ctx.github_repo,
+ tag = ctx.requested_server_version,
+ }
+end
+
+M.InstallReceiptBuilder = InstallReceiptBuilder
+
+return M