From 3e5c8e1777e3ec4062306fcb1bb131e1bca2adfe Mon Sep 17 00:00:00 2001 From: William Boman Date: Sun, 19 Feb 2023 22:54:29 +0100 Subject: feat(providers): add more endpoints (#1013) --- lua/mason-core/providers/init.lua | 31 ++++++++++++++++----- lua/mason-registry/api.lua | 37 ++++++++++++++++++++++++-- lua/mason-registry/bash-debug-adapter/init.lua | 1 - lua/mason/providers/registry-api/init.lua | 21 +++++++++++++++ 4 files changed, 80 insertions(+), 10 deletions(-) (limited to 'lua') diff --git a/lua/mason-core/providers/init.lua b/lua/mason-core/providers/init.lua index 8aabcde6..dca59d3f 100644 --- a/lua/mason-core/providers/init.lua +++ b/lua/mason-core/providers/init.lua @@ -2,8 +2,7 @@ local settings = require "mason.settings" local log = require "mason-core.log" local Result = require "mason-core.result" ----@alias GitHubReleaseAsset {url: string, id: integer, name: string, browser_download_url: string, created_at: string, updated_at: string, size: integer, download_count: integer} ----@alias GitHubRelease { tag_name: string, prerelease: boolean, draft: boolean, assets:GitHubReleaseAsset[] } +---@alias GitHubRelease { tag_name: string, prerelease: boolean, draft: boolean, assets: table[] } ---@alias GitHubTag { name: string } ---@class GitHubProvider @@ -30,11 +29,29 @@ local Result = require "mason-core.result" ---@field get_latest_version? async fun(gem: string): Result # Result ---@field get_all_versions? async fun(gem: string): Result # Result +---@alias PackagistPackage { name: string, version: string } + +---@class PackagistProvider +---@field get_latest_version? async fun(pkg: string): Result # Result +---@field get_all_versions? async fun(pkg: string): Result # Result + +---@alias Crate { name: string, version: string } + +---@class CratesProvider +---@field get_latest_version? async fun(crate: string): Result # Result +---@field get_all_versions? async fun(crate: string): Result # Result + +---@class GolangProvider +---@field get_all_versions? async fun(pkg: string): Result # Result + ---@class Provider ----@field github? GitHubProvider ----@field npm? NpmProvider ----@field pypi? PyPiProvider ----@field rubygems? RubyGemsProvider +---@field github? GitHubProvider +---@field npm? NpmProvider +---@field pypi? PyPiProvider +---@field rubygems? RubyGemsProvider +---@field packagist? PackagistProvider +---@field crates? CratesProvider +---@field golang? GolangProvider local function service_mt(service) return setmetatable({}, { @@ -65,7 +82,7 @@ local function service_mt(service) log.fmt_error("Unable to find provider %s is not registered. %s", provider_module, provider) end end - local err = ("No provider implementation found for %s.%s"):format(service, method) + local err = ("No provider implementation succeeded for %s.%s"):format(service, method) log.error(err) return Result.failure(err) end diff --git a/lua/mason-registry/api.lua b/lua/mason-registry/api.lua index 7d98c7ef..853690b9 100644 --- a/lua/mason-registry/api.lua +++ b/lua/mason-registry/api.lua @@ -26,10 +26,18 @@ function api.get(path, opts) }):map_catching(vim.json.decode) end ----@alias ApiSignature fun(path_params: T, opts?: ApiFetchOpts): Result +---@alias ApiSignature async fun(path_params: T, opts?: ApiFetchOpts): Result + +---@param char string +local function percent_encode(char) + return ("%%%x"):format(string.byte(char, 1, 1)) +end + +api.encode_uri_component = _.gsub("[!#%$&'%(%)%*%+,/:;=%?@%[%]]", percent_encode) ---@param path_template string local function get(path_template) + ---@async ---@param path_params table ---@param opts ApiFetchOpts? return function(path_params, opts) @@ -83,7 +91,32 @@ api.rubygems = { ---@type ApiSignature<{ gem: string }> latest = get "/api/rubygems/{gem}/versions/latest", ---@type ApiSignature<{ gem: string }> - all = get "/api/rubygemspypi/{gem}/versions/all", + all = get "/api/rubygems/{gem}/versions/all", + }, +} + +api.packagist = { + versions = { + ---@type ApiSignature<{ pkg: string }> + latest = get "/api/packagist/{pkg}/versions/latest", + ---@type ApiSignature<{ pkg: string }> + all = get "/api/packagist/{pkg}/versions/all", + }, +} + +api.crate = { + versions = { + ---@type ApiSignature<{ crate: string }> + latest = get "/api/crate/{crate}/versions/latest", + ---@type ApiSignature<{ crate: string }> + all = get "/api/crate/{crate}/versions/all", + }, +} + +api.golang = { + versions = { + ---@type ApiSignature<{ pkg: string }> + all = get "/api/golang/{pkg}/versions/all", }, } diff --git a/lua/mason-registry/bash-debug-adapter/init.lua b/lua/mason-registry/bash-debug-adapter/init.lua index c77abb81..6d98e2e8 100644 --- a/lua/mason-registry/bash-debug-adapter/init.lua +++ b/lua/mason-registry/bash-debug-adapter/init.lua @@ -25,7 +25,6 @@ return Pkg.new { end) :get_or_throw() - ---@type GitHubReleaseAsset local release_asset = _.find_first(_.prop_satisfies(_.matches "%.vsix$", "name"), release.assets) github diff --git a/lua/mason/providers/registry-api/init.lua b/lua/mason/providers/registry-api/init.lua index 8bab8911..0f98a407 100644 --- a/lua/mason/providers/registry-api/init.lua +++ b/lua/mason/providers/registry-api/init.lua @@ -40,4 +40,25 @@ return { return api.rubygems.versions.all { gem = gem } end, }, + packagist = { + get_latest_version = function(pkg) + return api.packagist.versions.latest { pkg = pkg } + end, + get_all_versions = function(pkg) + return api.packagist.versions.all { pkg = pkg } + end, + }, + crates = { + get_latest_version = function(crate) + return api.crate.versions.latest { crate = crate } + end, + get_all_versions = function(crate) + return api.crate.versions.all { crate = crate } + end, + }, + golang = { + get_all_versions = function(pkg) + return api.golang.versions.all { pkg = api.encode_uri_component(pkg) } + end, + }, } -- cgit v1.2.3-70-g09d2