fix: query strategy
This commit is contained in:
@ -1,9 +1,7 @@
|
||||
local Trans = require 'Trans'
|
||||
|
||||
|
||||
---@class TransBackend
|
||||
---@field no_wait? boolean whether need to wait for the result
|
||||
---@field all_name string[] @all backend name
|
||||
---@field name string @backend name
|
||||
---@field name_zh string @backend name in Chinese
|
||||
|
||||
@ -15,6 +13,9 @@ local Trans = require 'Trans'
|
||||
---@field header? table<string, string> | fun(data: TransData): table<string, string> @request header
|
||||
---@field debug? fun(body: table?) @debug
|
||||
|
||||
---@class TransOfflineBackend: TransBackend
|
||||
---@field query fun(data: TransData)
|
||||
---@field query_field string[] @query field
|
||||
|
||||
local conf = Trans.conf
|
||||
--- INFO :Parse online engine keys config file
|
||||
@ -29,8 +30,10 @@ if file then
|
||||
file:close()
|
||||
end
|
||||
|
||||
local all_name = {
|
||||
'offline', -- default backend
|
||||
}
|
||||
|
||||
local all_name = {}
|
||||
for _, config in ipairs(user_conf) do
|
||||
if not config.disable then
|
||||
all_name[#all_name + 1] = config.name
|
||||
@ -38,21 +41,57 @@ for _, config in ipairs(user_conf) do
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
---@class TransBackends
|
||||
---@field all_name string[] all backend names
|
||||
local M = {
|
||||
all_name = all_name,
|
||||
}
|
||||
|
||||
---Template method for online query
|
||||
---@param data TransData @data
|
||||
---@param backend TransOnlineBackend @backend
|
||||
function M.do_query(data, backend)
|
||||
local name = backend.name
|
||||
local uri = backend.uri
|
||||
local method = backend.method
|
||||
local formatter = backend.formatter
|
||||
local query = backend.get_query(data)
|
||||
local header = type(backend.header) == 'function' and backend.header(data) or backend.header
|
||||
|
||||
local function handle(output)
|
||||
local status, body = pcall(vim.json.decode, output.body)
|
||||
if not status or not body then
|
||||
if not Trans.conf.debug then
|
||||
backend.debug(body)
|
||||
data.trace[name] = output
|
||||
end
|
||||
|
||||
data.result[name] = false
|
||||
return
|
||||
end
|
||||
|
||||
data.result[name] = formatter(body, data)
|
||||
end
|
||||
|
||||
Trans.curl[method](uri, {
|
||||
query = query,
|
||||
callback = handle,
|
||||
header = header,
|
||||
})
|
||||
-- Hook ?
|
||||
end
|
||||
|
||||
---@class Trans
|
||||
---@field backend TransBackends
|
||||
return setmetatable({
|
||||
all_name = all_name,
|
||||
}, {
|
||||
return setmetatable(M, {
|
||||
__index = function(self, name)
|
||||
---@type TransBackend
|
||||
local backend = require('Trans.backend.' .. name)
|
||||
|
||||
for key, value in pairs(user_conf[name] or {}) do
|
||||
backend[key] = value
|
||||
if user_conf[name] then
|
||||
for key, value in pairs(user_conf[name]) do
|
||||
backend[key] = value
|
||||
end
|
||||
end
|
||||
|
||||
self[name] = backend
|
||||
|
@ -10,7 +10,7 @@ local Trans = require 'Trans'
|
||||
---@field result table<string, TransResult|nil|false> @The result of the translation
|
||||
---@field frontend TransFrontend
|
||||
---@field trace table<string, string> debug message
|
||||
---@field backends table<string, TransBackend>
|
||||
---@field backends TransBackend[]
|
||||
local M = {}
|
||||
M.__index = M
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
local Trans = require 'Trans'
|
||||
local frontend_opts = Trans.conf.frontend
|
||||
|
||||
|
||||
---@class TransFrontend
|
||||
---@field opts TransFrontendOpts
|
||||
---@field get_active_instance fun():TransFrontend?
|
||||
|
@ -1,80 +1,12 @@
|
||||
local Trans = require 'Trans'
|
||||
local util = Trans.util
|
||||
|
||||
local function init_opts(opts)
|
||||
opts = opts or {}
|
||||
opts.mode = opts.mode or vim.fn.mode()
|
||||
opts.str = util.get_str(opts.mode)
|
||||
return opts
|
||||
end
|
||||
|
||||
|
||||
---To Do Online Query
|
||||
---@param data TransData @data
|
||||
---@param backend TransOnlineBackend @backend
|
||||
local function do_query(data, backend)
|
||||
-- TODO : template method for online query
|
||||
local name = backend.name
|
||||
local uri = backend.uri
|
||||
local method = backend.method
|
||||
local formatter = backend.formatter
|
||||
local query = backend.get_query(data)
|
||||
local header = type(backend.header) == 'function' and backend.header(data) or backend.header
|
||||
|
||||
local function handle(output)
|
||||
local status, body = pcall(vim.json.decode, output.body)
|
||||
if not status or not body then
|
||||
if not Trans.conf.debug then
|
||||
backend.debug(body)
|
||||
data.trace[name] = output
|
||||
end
|
||||
|
||||
data.result[name] = false
|
||||
return
|
||||
end
|
||||
|
||||
-- vim.print(data.result[name])
|
||||
data.result[name] = formatter(body, data)
|
||||
end
|
||||
|
||||
Trans.curl[method](uri, {
|
||||
query = query,
|
||||
callback = handle,
|
||||
header = header,
|
||||
})
|
||||
-- Hook ?
|
||||
end
|
||||
|
||||
---@type table<string, fun(data: TransData):boolean>
|
||||
local strategy = {
|
||||
fallback = function(data)
|
||||
local result = data.result
|
||||
Trans.backend.offline.query(data)
|
||||
|
||||
if result.offline then return true end
|
||||
|
||||
local update = data.frontend:wait()
|
||||
for _, backend in ipairs(data.backends) do
|
||||
do_query(data, backend)
|
||||
|
||||
local name = backend.name
|
||||
---@cast backend TransBackend
|
||||
while result[name] == nil and update(backend) do
|
||||
end
|
||||
|
||||
if result[name] then return true end
|
||||
end
|
||||
|
||||
return false
|
||||
end,
|
||||
--- TODO :More Strategys
|
||||
}
|
||||
|
||||
|
||||
-- HACK : Core process logic
|
||||
local function process(opts)
|
||||
opts = init_opts(opts)
|
||||
local str = opts.str
|
||||
opts = opts or {}
|
||||
opts.mode = opts.mode or vim.fn.mode()
|
||||
local str = Trans.util.get_str(opts.mode)
|
||||
opts.str = str
|
||||
|
||||
if not str or str == '' then return end
|
||||
|
||||
|
||||
@ -86,7 +18,7 @@ local function process(opts)
|
||||
end
|
||||
|
||||
local data = Trans.data.new(opts)
|
||||
if strategy[data.frontend.opts.query](data) then
|
||||
if Trans.strategy[data.frontend.opts.query](data) then
|
||||
Trans.cache[data.str] = data
|
||||
data.frontend:process(data)
|
||||
else
|
||||
@ -94,9 +26,9 @@ local function process(opts)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
---@class Trans
|
||||
---@field translate fun(opts: { frontend: string?, mode: string?}?) Translate string core function
|
||||
|
||||
return function(opts)
|
||||
coroutine.wrap(process)(opts)
|
||||
end
|
||||
|
Reference in New Issue
Block a user