Skip to content

Commit

Permalink
feat: port hurl plugin from ray-x/web-tools.nvim
Browse files Browse the repository at this point in the history
  • Loading branch information
jellydn committed Oct 21, 2023
1 parent 935045f commit 888bd0f
Show file tree
Hide file tree
Showing 9 changed files with 389 additions and 14 deletions.
18 changes: 18 additions & 0 deletions hurl.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
nvim
vlog
vararg
getpos
tempname
tjdevries
neovim
echohl
outfile
stdpath
nameupper
lineinfo
currentline
echom
jobstart
setqflist
copen
fargs
nargs
docstrings
sweepai
pygithub
Expand Down
11 changes: 0 additions & 11 deletions lua/hurl.nvim/init.lua

This file was deleted.

20 changes: 20 additions & 0 deletions lua/hurl/init.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--- Global configuration for hurl.nvim
_HURL_CFG = {
-- Debug mode
-- Default: false
debug = false,
--- Show headers in the response buffer
--- Default: false
show_headers = false,
}
local M = {}

function M.setup(options)
_HURL_CFG = vim.tbl_extend('force', _HURL_CFG, options or {})

require('hurl.utils').log('hurl.nvim loaded')

require('hurl.wrapper').setup()
end

return M
65 changes: 65 additions & 0 deletions lua/hurl/utils.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
local log = require('hurl.vlog')

local util = {}

--- Log function
--- Print the variable to stdout
---@vararg any
util.log = function(...)
-- Only print when debug is on
if not _HURL_CFG.debug then
return
end

log.info(...)
end

--- Get visual selection
---@return string[]
util.get_visual_selection = function()
local s_start = vim.fn.getpos("'<")
local s_end = vim.fn.getpos("'>")
local n_lines = math.abs(s_end[2] - s_start[2]) + 1
local lines = vim.api.nvim_buf_get_lines(0, s_start[2] - 1, s_end[2], false)
lines[1] = string.sub(lines[1], s_start[3], -1)
if n_lines == 1 then
lines[n_lines] = string.sub(lines[n_lines], 1, s_end[3] - s_start[3] + 1)
else
lines[n_lines] = string.sub(lines[n_lines], 1, s_end[3])
end
return lines
end

--- Create tmp file
---@param content any
---@return string|nil
util.create_tmp_file = function(content)
local tmp_file = vim.fn.tempname()
if not tmp_file then
return
end

local f = io.open(tmp_file, 'w')
if not f then
return
end
if type(content) == 'table' then
local c = vim.fn.join(content, '\n')
f:write(c)
else
f:write(content)
end
f:close()
return tmp_file
end

--- Create custom command
---@param cmd string The command name
---@param func function The function to execute
---@param opt table The options
util.create_cmd = function(cmd, func, opt)
opt = vim.tbl_extend('force', { desc = 'hurl.nvim ' .. cmd }, opt or {})
vim.api.nvim_create_user_command(cmd, func, opt)
end

return util
148 changes: 148 additions & 0 deletions lua/hurl/vlog.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
-- -- log.lua
--
-- Inspired by rxi/log.lua
-- Modified by tjdevries and can be found at github.com/tjdevries/vlog.nvim
--
-- This library is free software; you can redistribute it and/or modify it
-- under the terms of the MIT license. See LICENSE for details.

-- User configuration section
local default_config = {
-- Name of the plugin. Prepended to log messages
plugin = 'hurl.nvim',

-- Should print the output to neovim while running
use_console = true,

-- Should highlighting be used in console (using echohl)
highlights = true,

-- Should write to a file
use_file = true,

-- Any messages above this level will be logged.
level = 'trace',

-- Level configuration
modes = {
{ name = 'trace', hl = 'Comment' },
{ name = 'debug', hl = 'Comment' },
{ name = 'info', hl = 'None' },
{ name = 'warn', hl = 'WarningMsg' },
{ name = 'error', hl = 'ErrorMsg' },
{ name = 'fatal', hl = 'ErrorMsg' },
},

-- Can limit the number of decimals displayed for floats
float_precision = 0.01,
}

-- {{{ NO NEED TO CHANGE
local log = {}

local unpack = unpack or table.unpack

log.new = function(config, standalone)
config = vim.tbl_deep_extend('force', default_config, config)

local outfile =
string.format('%s/%s.log', vim.api.nvim_call_function('stdpath', { 'data' }), config.plugin)

local obj
if standalone then
obj = log
else
obj = {}
end

local levels = {}
for i, v in ipairs(config.modes) do
levels[v.name] = i
end

local round = function(x, increment)
increment = increment or 1
x = x / increment
return (x > 0 and math.floor(x + 0.5) or math.ceil(x - 0.5)) * increment
end

local make_string = function(...)
local t = {}
for i = 1, select('#', ...) do
local x = select(i, ...)

if type(x) == 'number' and config.float_precision then
x = tostring(round(x, config.float_precision))
elseif type(x) == 'table' then
x = vim.inspect(x)
else
x = tostring(x)
end

t[#t + 1] = x
end
return table.concat(t, ' ')
end

local log_at_level = function(level, level_config, message_maker, ...)
-- Return early if we're below the config.level
if level < levels[config.level] then
return
end
local nameupper = level_config.name:upper()

local msg = message_maker(...)
local info = debug.getinfo(2, 'Sl')
local lineinfo = info.short_src .. ':' .. info.currentline

-- Output to console
if config.use_console then
local console_string =
string.format('[%-6s%s] %s: %s', nameupper, os.date('%H:%M:%S'), lineinfo, msg)

if config.highlights and level_config.hl then
vim.cmd(string.format('echohl %s', level_config.hl))
end

local split_console = vim.split(console_string, '\n')
for _, v in ipairs(split_console) do
vim.cmd(string.format([[echom "[%s] %s"]], config.plugin, vim.fn.escape(v, '"')))
end

if config.highlights and level_config.hl then
vim.cmd('echohl NONE')
end
end

-- Output to log file
if config.use_file then
local fp = io.open(outfile, 'a')
local str = string.format('[%-6s%s] %s: %s\n', nameupper, os.date(), lineinfo, msg)
fp:write(str)
fp:close()
end
end

for i, x in ipairs(config.modes) do
obj[x.name] = function(...)
return log_at_level(i, x, make_string, ...)
end

obj[('fmt_%s'):format(x.name)] = function()
return log_at_level(i, x, function(...)
local passed = { ... }
local fmt = table.remove(passed, 1)
local inspected = {}
for _, v in ipairs(passed) do
table.insert(inspected, vim.inspect(v))
end
return string.format(fmt, unpack(inspected))
end)
end
end
end

log.new(default_config, true)
-- }}}
--
return log
Loading

0 comments on commit 888bd0f

Please sign in to comment.