fix: query strategy

This commit is contained in:
JuanZoran
2023-05-06 11:38:37 +08:00
parent ab212fefe1
commit f17171d28b
10 changed files with 110 additions and 103 deletions

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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