feat(archive): duration syntax and confirmation prompt (#113)
* feat(s3): create bucket interactively during auth when unconfigured Problem: when a user runs `:Pending s3 auth` with no bucket configured, auth succeeds but offers no way to create the bucket. The user must manually run `aws s3api create-bucket` and update their config. Solution: add `util.input()` coroutine-aware prompt wrapper and a `create_bucket()` flow in `s3.lua` that prompts for bucket name and region, handles the `us-east-1` LocationConstraint quirk, and logs a config snippet on success. Called automatically from `auth()` when `sync.s3.bucket` is absent. * ci: typing * feat(parse): add `parse_duration_to_days` for duration string conversion Problem: The archive command accepted only a bare integer for days, inconsistent with the `+Nd`/`+Nw`/`+Nm` duration syntax used elsewhere. Solution: Add `parse_duration_to_days()` supporting `Nd`, `Nw`, `Nm`, and bare integers. Returns nil on invalid input for caller error handling. * feat(archive): duration syntax and confirmation prompt Problem: `:Pending archive` accepted only a bare integer for days and silently deleted tasks with no confirmation, risking accidental data loss. Solution: Accept duration strings (`7d`, `3w`, `2m`) via `parse.parse_duration_to_days()`, show a `vim.ui.input` confirmation prompt before removing tasks, and skip the prompt when zero tasks match.
This commit is contained in:
parent
7640241cf2
commit
dc365e266b
6 changed files with 287 additions and 25 deletions
|
|
@ -667,4 +667,29 @@ function M.is_today(due)
|
|||
return time_part >= current_time
|
||||
end
|
||||
|
||||
---@param s? string
|
||||
---@return integer?
|
||||
function M.parse_duration_to_days(s)
|
||||
if s == nil or s == '' then
|
||||
return nil
|
||||
end
|
||||
local n = s:match('^(%d+)d$')
|
||||
if n then
|
||||
return tonumber(n) --[[@as integer]]
|
||||
end
|
||||
n = s:match('^(%d+)w$')
|
||||
if n then
|
||||
return tonumber(n) --[[@as integer]] * 7
|
||||
end
|
||||
n = s:match('^(%d+)m$')
|
||||
if n then
|
||||
return tonumber(n) --[[@as integer]] * 30
|
||||
end
|
||||
n = s:match('^(%d+)$')
|
||||
if n then
|
||||
return tonumber(n) --[[@as integer]]
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
return M
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue