|
1 | 1 | local Result = require "mason-core.result" |
| 2 | +local common = require "mason-core.installer.managers.common" |
| 3 | +local util = require "mason-core.installer.registry.util" |
| 4 | +local expr = require "mason-core.installer.registry.expr" |
| 5 | +local nuget = require "mason-core.installer.managers.nuget" |
2 | 6 | local _ = require "mason-core.functional" |
3 | 7 |
|
4 | 8 | local M = {} |
5 | 9 |
|
6 | | ----@param source RegistryPackageSource |
| 10 | +---@class NugetPackageSource : RegistryPackageSource |
| 11 | +---@field download FileDownloadSpec |
| 12 | + |
| 13 | +---@param source NugetPackageSource |
7 | 14 | ---@param purl Purl |
8 | 15 | function M.parse(source, purl) |
| 16 | + return Result.try(function (try) |
| 17 | + local repository_url = _.path({ "qualifiers", "repository_url" }, purl) |
9 | 18 |
|
10 | | - local repository_url = _.path({ "qualifiers", "repository_url" }, purl) |
| 19 | + local download_item = nil |
| 20 | + if source.download then |
11 | 21 |
|
12 | | - if not repository_url then |
13 | | - repository_url = "https://api.nuget.org/v3/index.json" |
14 | | - end |
| 22 | + if not repository_url then |
| 23 | + -- if not set we need to provide repository url because we need it for |
| 24 | + -- download url discovery |
| 25 | + repository_url = "https://api.nuget.org/v3/index.json" |
| 26 | + end |
| 27 | + |
| 28 | + local index_file = try(nuget.fetch_nuget_endpoint(repository_url)) |
| 29 | + |
| 30 | + local resource = vim.iter(index_file.resources) |
| 31 | + :find(function (v) |
| 32 | + return v['@type'] == 'PackageBaseAddress/3.0.0' |
| 33 | + end) |
| 34 | + |
| 35 | + assert(resource, "could not get PackageBaseAddress resource from nuget index file") |
| 36 | + |
| 37 | + local package_base_address = resource["@id"] |
| 38 | + local package_lowercase = purl.name:lower() |
15 | 39 |
|
16 | | - ---@class ParsedNugetSource : ParsedPackageSource |
17 | | - ---@field repository_url string Custom repository URL to pull from |
18 | | - local parsed_source = { |
19 | | - package = purl.name, |
20 | | - version = purl.version, |
21 | | - repository_url = repository_url |
22 | | - } |
| 40 | + local nupkg_download_url = string.format("%s%s/%s/%s.%s.nupkg", |
| 41 | + package_base_address, |
| 42 | + package_lowercase, |
| 43 | + purl.version, |
| 44 | + package_lowercase, |
| 45 | + purl.version) |
23 | 46 |
|
24 | | - return Result.success(parsed_source) |
| 47 | + local expr_ctx = { version = purl.version } |
| 48 | + |
| 49 | + ---@type FileDownloadSpec |
| 50 | + local download_spec = try(util.coalesce_by_target(try(expr.tbl_interpolate(source.download, expr_ctx)), {})) |
| 51 | + |
| 52 | + download_item = { |
| 53 | + download_url = nupkg_download_url, |
| 54 | + out_file = download_spec.file |
| 55 | + } |
| 56 | + end |
| 57 | + |
| 58 | + ---@class ParsedNugetSource : ParsedPackageSource |
| 59 | + ---@field download? DownloadItem |
| 60 | + ---@field repository_url string Custom repository URL to pull from |
| 61 | + local parsed_source = { |
| 62 | + package = purl.name, |
| 63 | + version = purl.version, |
| 64 | + download = download_item, |
| 65 | + repository_url = repository_url |
| 66 | + } |
| 67 | + |
| 68 | + return parsed_source |
| 69 | + end) |
25 | 70 | end |
26 | 71 |
|
27 | 72 | ---@async |
28 | 73 | ---@param ctx InstallContext |
29 | 74 | ---@param source ParsedNugetSource |
30 | 75 | function M.install(ctx, source) |
31 | | - local nuget = require "mason-core.installer.managers.nuget" |
32 | | - return nuget.install(source.package, source.version, source.repository_url) |
| 76 | + if source.download then |
| 77 | + return common.download_files(ctx, {source.download}) |
| 78 | + else |
| 79 | + return nuget.install(source.package, source.version, source.repository_url) |
| 80 | + end |
33 | 81 | end |
34 | 82 |
|
35 | 83 | ---@async |
|
0 commit comments