Skip to content

Commit dac4648

Browse files
committed
refactor(state): use std.RawGet and keyof OpencodeState in annotations
1 parent ff2bf75 commit dac4648

4 files changed

Lines changed: 103 additions & 101 deletions

File tree

lua/opencode/state.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
return require('opencode.state.init')
1+
return require('opencode.state.init') --[[@as OpencodeStateModule]]

lua/opencode/state/init.lua

Lines changed: 12 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,3 @@
1-
---@class OpencodeWindowState
2-
---@field input_win integer|nil
3-
---@field output_win integer|nil
4-
---@field footer_win integer|nil
5-
---@field footer_buf integer|nil
6-
---@field input_buf integer|nil
7-
---@field output_buf integer|nil
8-
---@field output_was_at_bottom boolean|nil
9-
10-
---@class OpencodeHiddenBuffers
11-
---@field input_buf integer
12-
---@field output_buf integer
13-
---@field footer_buf integer|nil
14-
---@field output_was_at_bottom boolean
15-
---@field input_hidden boolean
16-
---@field input_cursor integer[]|nil
17-
---@field output_cursor integer[]|nil
18-
---@field output_view table|nil
19-
---@field focused_window 'input'|'output'|nil
20-
---@field position 'right'|'left'|'current'|nil
21-
---@field owner_tab integer|nil
22-
23-
---@class OpencodeToggleDecision
24-
---@field action 'open'|'close'|'hide'|'close_hidden'|'restore_hidden'|'migrate'
25-
26-
---@class OpencodeState
27-
---@field windows OpencodeWindowState|nil
28-
---@field is_opening boolean
29-
---@field input_content table
30-
---@field is_opencode_focused boolean
31-
---@field last_focused_opencode_window string|nil
32-
---@field last_input_window_position integer[]|nil
33-
---@field last_output_window_position integer[]|nil
34-
---@field last_code_win_before_opencode integer|nil
35-
---@field current_code_buf number|nil
36-
---@field saved_window_options table|nil
37-
---@field display_route any|nil
38-
---@field current_mode string
39-
---@field last_output number
40-
---@field last_sent_context OpencodeContext|nil
41-
---@field current_context_config OpencodeContextConfig|nil
42-
---@field context_updated_at number|nil
43-
---@field active_session Session|nil
44-
---@field restore_points RestorePoint[]
45-
---@field current_model string|nil
46-
---@field user_mode_model_map table<string, string>
47-
---@field current_model_info table|nil
48-
---@field current_variant string|nil
49-
---@field messages OpencodeMessage[]|nil
50-
---@field current_message OpencodeMessage|nil
51-
---@field last_user_message OpencodeMessage|nil
52-
---@field pending_permissions OpencodePermission[]
53-
---@field cost number
54-
---@field tokens_count number
55-
---@field job_count number
56-
---@field user_message_count table<string, number>
57-
---@field opencode_server OpencodeServer|nil
58-
---@field api_client OpencodeApiClient
59-
---@field event_manager EventManager|nil
60-
---@field pre_zoom_width integer|nil
61-
---@field last_window_width_ratio number|nil
62-
---@field required_version string
63-
---@field opencode_cli_version string|nil
64-
---@field current_cwd string|nil
65-
---@field _hidden_buffers OpencodeHiddenBuffers|nil
66-
---@field append fun(key:string, value:any)
67-
---@field remove fun(key:string, idx:number)
68-
---@field subscribe fun(key:string|string[]|nil, cb:fun(key:string, new_val:any, old_val:any))
69-
---@field unsubscribe fun(key:string|nil, cb:fun(key:string, new_val:any, old_val:any))
70-
---@field is_running fun():boolean
71-
---@field session OpencodeSessionStateMutations
72-
---@field jobs OpencodeJobStateMutations
73-
---@field ui OpencodeUiStateMutations
74-
---@field model OpencodeModelStateMutations
75-
---@field renderer OpencodeRendererStateMutations
76-
---@field context OpencodeContextStateMutations
77-
781
local store = require('opencode.state.store')
792
local session = require('opencode.state.session')
803
local jobs = require('opencode.state.jobs')
@@ -83,6 +6,18 @@ local model = require('opencode.state.model')
836
local renderer = require('opencode.state.renderer')
847
local context = require('opencode.state.context')
858

9+
---@class OpencodeStateModule
10+
---@field store OpencodeStateStore<OpencodeStateData>
11+
---@field session OpencodeSessionStateMutations
12+
---@field jobs OpencodeJobStateMutations
13+
---@field ui OpencodeUiStateMutations
14+
---@field model OpencodeModelStateMutations
15+
---@field renderer OpencodeRendererStateMutations
16+
---@field context OpencodeContextStateMutations
17+
---@field is_running fun():boolean
18+
19+
---@alias OpencodeState OpencodeStateModule & OpencodeStateData
20+
---@type OpencodeState
8621
local M = {
8722
store = store,
8823
session = session,

lua/opencode/state/store.lua

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,49 @@
44

55
local M = {}
66

7-
---@type OpencodeState
7+
---@class OpencodeStateData
8+
---@field windows OpencodeWindowState|nil
9+
---@field is_opening boolean
10+
---@field input_content table
11+
---@field is_opencode_focused boolean
12+
---@field last_focused_opencode_window string|nil
13+
---@field last_input_window_position integer[]|nil
14+
---@field last_output_window_position integer[]|nil
15+
---@field last_code_win_before_opencode integer|nil
16+
---@field current_code_buf number|nil
17+
---@field current_code_view table|nil
18+
---@field saved_window_options table|nil
19+
---@field display_route string|nil
20+
---@field current_mode string|nil
21+
---@field last_output number
22+
---@field last_sent_context OpencodeContext|nil
23+
---@field current_context_config OpencodeContextConfig|nil
24+
---@field context_updated_at number|nil
25+
---@field active_session Session|nil
26+
---@field restore_points RestorePoint[]
27+
---@field current_model string|nil
28+
---@field user_mode_model_map table<string, string>
29+
---@field current_model_info table|nil
30+
---@field current_variant string|nil
31+
---@field messages OpencodeMessage[]|nil
32+
---@field current_message OpencodeMessage|nil
33+
---@field last_user_message OpencodeMessage|nil
34+
---@field pending_permissions OpencodePermission[]
35+
---@field cost number
36+
---@field tokens_count number
37+
---@field job_count number
38+
---@field user_message_count table<string, number>
39+
---@field opencode_server OpencodeServer|nil
40+
---@field api_client OpencodeApiClient|nil
41+
---@field event_manager EventManager|nil
42+
---@field pre_zoom_width integer|nil
43+
---@field last_window_width_ratio number|nil
44+
---@field required_version string
45+
---@field opencode_cli_version string|nil
46+
---@field current_cwd string|nil
47+
---@field _hidden_buffers OpencodeHiddenBuffers|nil
48+
49+
---@type OpencodeStateData
850
local _state = {
951
windows = nil,
1052
is_opening = false,
@@ -49,7 +91,7 @@ local _state = {
4991

5092
local _listeners = {}
5193

52-
---@param key string
94+
---@param key keyof OpencodeStateData
5395
---@param opts? OpencodeProtectedStateSetOptions
5496
local function error_on_raw_write(key, opts)
5597
if opts and opts.silent then
@@ -63,18 +105,18 @@ function M.state()
63105
return _state
64106
end
65107

66-
---@generic K extends keyof OpencodeState
108+
---@generic K extends keyof OpencodeStateData
67109
---@param key K
68-
---@return OpencodeState[K]
110+
---@return std.RawGet<OpencodeStateData, K>
69111
function M.get(key)
70112
return _state[key]
71113
end
72114

73-
---@generic K extends keyof OpencodeState
115+
---@generic K extends keyof OpencodeStateData
74116
---@param key K
75-
---@param value OpencodeState[K]
117+
---@param value std.RawGet<OpencodeStateData, K>
76118
---@param opts? OpencodeProtectedStateSetOptions
77-
---@return OpencodeState[K]
119+
---@return std.RawGet<OpencodeStateData, K>
78120
function M.set(key, value, opts)
79121
local old = _state[key]
80122
opts = opts or { source = 'helper' }
@@ -91,30 +133,30 @@ function M.set(key, value, opts)
91133
return value
92134
end
93135

94-
---@generic K extends keyof OpencodeState
136+
---@generic K extends keyof OpencodeStateData
95137
---@param key K
96-
---@param value OpencodeState[K]
138+
---@param value std.RawGet<OpencodeStateData, K>
97139
---@param opts? OpencodeProtectedStateSetOptions
98-
---@return OpencodeState[K]
140+
---@return std.RawGet<OpencodeStateData, K>
99141
function M.set_raw(key, value, opts)
100142
local next_opts = vim.tbl_extend('force', { source = 'raw' }, opts or {})
101143
return M.set(key, value, next_opts)
102144
end
103145

104-
---@generic K extends keyof OpencodeState
146+
---@generic K extends keyof OpencodeStateData
105147
---@param key K
106-
---@param updater fun(current: OpencodeState[K]): OpencodeState[K]
148+
---@param updater fun(current: std.RawGet<OpencodeStateData, K>): std.RawGet<OpencodeStateData, K>
107149
---@param opts? OpencodeProtectedStateSetOptions
108-
---@return OpencodeState[K]
150+
---@return std.RawGet<OpencodeStateData, K>
109151
function M.update(key, updater, opts)
110152
local next_value = updater(_state[key])
111153
M.set(key, next_value, opts)
112154
return next_value
113155
end
114156

115-
---@generic K extends keyof OpencodeState
157+
---@generic K extends keyof OpencodeStateData
116158
---@param key K|K[]|nil
117-
---@param cb fun(key:K, new_val:OpencodeState[K], old_val:OpencodeState[K])
159+
---@param cb fun(key:K, new_val:std.RawGet<OpencodeStateData, K>, old_val:std.RawGet<OpencodeStateData, K>)
118160
function M.subscribe(key, cb)
119161
if type(key) == 'table' then
120162
for _, current_key in ipairs(key) do
@@ -137,9 +179,9 @@ function M.subscribe(key, cb)
137179
table.insert(_listeners[key], cb)
138180
end
139181

140-
---@generic K extends keyof OpencodeState
182+
---@generic K extends keyof OpencodeStateData
141183
---@param key K|nil
142-
---@param cb fun(key:K, new_val:OpencodeState[K], old_val:OpencodeState[K])
184+
---@param cb fun(key:K, new_val:std.RawGet<OpencodeStateData, K>, old_val:std.RawGet<OpencodeStateData, K>)
143185
function M.unsubscribe(key, cb)
144186
key = key or '*'
145187
local list = _listeners[key]
@@ -154,10 +196,10 @@ function M.unsubscribe(key, cb)
154196
end
155197
end
156198

157-
---@generic K extends keyof OpencodeState
199+
---@generic K extends keyof OpencodeStateData
158200
---@param key K
159-
---@param new_val OpencodeState[K]
160-
---@param old_val OpencodeState[K]
201+
---@param new_val std.RawGet<OpencodeStateData, K>
202+
---@param old_val std.RawGet<OpencodeStateData, K>
161203
function M.emit(key, new_val, old_val)
162204
vim.schedule(function()
163205
if _listeners[key] then
@@ -177,9 +219,9 @@ function M.emit(key, new_val, old_val)
177219
end)
178220
end
179221

180-
---@generic K extends keyof OpencodeState
222+
---@generic K extends keyof OpencodeStateData
181223
---@param key K
182-
---@param value OpencodeState[K] extends any[] and OpencodeState[K][integer] or never
224+
---@param value std.RawGet<OpencodeStateData, K> extends any[] and std.RawGet<OpencodeStateData, K>[integer] or never
183225
function M.append(key, value)
184226
if type(value) ~= 'table' then
185227
error('Value must be a table to append')
@@ -196,7 +238,7 @@ function M.append(key, value)
196238
M.emit(key, _state[key], old)
197239
end
198240

199-
---@generic K extends keyof OpencodeState
241+
---@generic K extends keyof OpencodeStateData
200242
---@param key K
201243
---@param idx integer
202244
function M.remove(key, idx)

lua/opencode/state/ui.lua

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,30 @@
11
local store = require('opencode.state.store')
22

3+
---@class OpencodeToggleDecision
4+
---@field action 'open'|'close'|'hide'|'close_hidden'|'restore_hidden'|'migrate'
5+
6+
---@class OpencodeHiddenBuffers
7+
---@field input_buf integer
8+
---@field output_buf integer
9+
---@field footer_buf integer|nil
10+
---@field output_was_at_bottom boolean
11+
---@field input_hidden boolean
12+
---@field input_cursor integer[]|nil
13+
---@field output_cursor integer[]|nil
14+
---@field output_view table|nil
15+
---@field focused_window 'input'|'output'|nil
16+
---@field position 'right'|'left'|'current'|nil
17+
---@field owner_tab integer|nil
18+
19+
---@class OpencodeWindowState
20+
---@field input_win integer|nil
21+
---@field output_win integer|nil
22+
---@field footer_win integer|nil
23+
---@field footer_buf integer|nil
24+
---@field input_buf integer|nil
25+
---@field output_buf integer|nil
26+
---@field output_was_at_bottom boolean|nil
27+
328
---@class OpencodeUiStateMutations
429
---@field set_windows fun(windows: OpencodeWindowState|nil)
530
---@field clear_windows fun()

0 commit comments

Comments
 (0)