Skip to main content

futucli/cli/commands/
sys.rs

1//! System/status clap argument structs split from commands.rs.
2
3use std::path::PathBuf;
4
5use clap::{Args, Subcommand};
6
7#[derive(Args)]
8pub struct QuoteRightsArgs {
9    /// 查询前先触发 request_highest_quote_right 刷新
10    #[arg(long)]
11    pub(crate) refresh: bool,
12}
13
14#[derive(Args)]
15pub struct QuoteCapabilityArgs {
16    /// 股票代码,MARKET.CODE 格式(位置参数)或 `--symbol`/`--code` 指定
17    #[arg(index = 1, value_name = "SYMBOL")]
18    pub(crate) symbol_positional: Option<String>,
19
20    /// 股票代码,MARKET.CODE 格式
21    #[arg(
22        long = "symbol",
23        visible_aliases = ["code", "stock"],
24        conflicts_with = "symbol_positional",
25        value_name = "SYMBOL"
26    )]
27    pub(crate) symbol_arg: Option<String>,
28}
29
30#[derive(Args)]
31pub struct TickerStatisticArgs {
32    /// 证券 symbol (e.g. HK.00700, US.AAPL) — 位置参数或 --symbol 二选一
33    #[arg(index = 1, value_name = "SYMBOL")]
34    pub(crate) symbol_pos: Option<String>,
35
36    /// 证券 symbol (named arg form, 兼容老用法)
37    #[arg(long = "symbol", conflicts_with = "symbol_pos")]
38    pub(crate) symbol: Option<String>,
39
40    /// 逐笔类型 0=ALL, 1=BUY, 2=SELL, 3=BUY_AND_SELL, 4=NEUTRAL
41    #[arg(long)]
42    pub(crate) ticker_type: Option<i32>,
43
44    /// 市场状态 0=ALL, 1=BEFORE, 2=TRADING, 3=AFTER
45    #[arg(long)]
46    pub(crate) stat_type: Option<u32>,
47}
48
49#[derive(Args)]
50pub struct TickerStatisticDetailArgs {
51    /// 证券 symbol (e.g. HK.00700, US.AAPL) — 位置参数或 --symbol 二选一
52    #[arg(index = 1, value_name = "SYMBOL")]
53    pub(crate) symbol_pos: Option<String>,
54
55    /// 证券 symbol (named arg form, 兼容老用法)
56    #[arg(long = "symbol", conflicts_with = "symbol_pos")]
57    pub(crate) symbol: Option<String>,
58
59    /// 逐笔类型 0=ALL, 1=BUY, 2=SELL, 3=BUY_AND_SELL, 4=NEUTRAL
60    #[arg(long)]
61    pub(crate) ticker_type: Option<i32>,
62
63    /// 时间戳 (ms) — 通常从前一次 ticker-statistic call 拿到. 0/省略 = backend 默认
64    #[arg(long)]
65    pub(crate) ticker_time: Option<u64>,
66
67    /// 筛选 0=全部价位 / 1..N=top N 价位 (backend max ~100)
68    #[arg(long)]
69    pub(crate) select_num: Option<u32>,
70
71    /// 分页 起始项 (默认 0)
72    #[arg(long)]
73    pub(crate) data_from: Option<u32>,
74
75    /// 分页 size 单页最大 (默认 20)
76    #[arg(long)]
77    pub(crate) data_max_count: Option<u32>,
78
79    /// 市场状态 0=ALL, 1=BEFORE, 2=TRADING, 3=AFTER
80    #[arg(long)]
81    pub(crate) stat_type: Option<u32>,
82}
83
84#[derive(Args)]
85pub struct QuerySubscriptionArgs {
86    /// 是否查询所有连接(默认只查本连接)
87    #[arg(long)]
88    pub(crate) all_conn: bool,
89}
90
91#[derive(Args)]
92pub struct UnsubscribeArgs {
93    /// 证券列表,逗号分隔(--all 时忽略)
94    #[arg(long, default_value = "")]
95    pub(crate) symbols: String,
96
97    /// 订阅类型 id 列表,逗号分隔(proto Qot_Common.SubType: 1=Basic 2=OrderBook
98    /// 4=Ticker 5=RT 6=KL_Day 7=KL_5Min 8=KL_15Min 9=KL_30Min 10=KL_60Min
99    /// 11=KL_1Min 12=KL_Week 13=KL_Month 14=Broker 15=KL_Quarter 16=KL_Year
100    /// 17=KL_3Min 18=KL_10Min 19=KL_120Min 20=KL_180Min 21=KL_240Min,
101    /// 22=OrderBook_Odd, 跳 3=None)
102    #[arg(long, default_value = "")]
103    pub(crate) sub_types: String,
104
105    /// 清空本连接所有订阅
106    #[arg(long)]
107    pub(crate) all: bool,
108}
109
110#[derive(Args)]
111pub struct HistoryKlQuotaArgs {
112    /// 是否返回每只股票的下载详情(默认 false);总额度跟随账号动态 API quota
113    #[arg(long)]
114    pub(crate) detail: bool,
115}
116
117#[derive(Args)]
118pub struct DaemonStatusArgs {
119    /// 目标 REST 端口 URL(默认从 FUTU_REST_URL 环境变量读,或 http://127.0.0.1:22222)
120    #[arg(long)]
121    pub(crate) rest_url: Option<String>,
122
123    /// v1.4.52 BUG-9: REST/MCP 风格用户习惯指定 port,自动转 http://127.0.0.1:<port>
124    #[arg(long, conflicts_with = "rest_url")]
125    pub(crate) rest_port: Option<u16>,
126
127    /// 带 Bearer Token(scope 模式下需要 admin scope 的 key)
128    #[arg(long)]
129    pub(crate) api_key: Option<String>,
130}
131
132#[derive(Args)]
133pub struct PushSubscriberInfoArgs {
134    /// 目标 REST 端点 URL(默认从 FUTU_REST_URL 环境变量读,或 http://127.0.0.1:22222)
135    #[arg(long)]
136    pub(crate) rest_url: Option<String>,
137
138    /// REST/MCP 风格用户习惯指定 port,自动转 http://127.0.0.1:<port>
139    #[arg(long, conflicts_with = "rest_url")]
140    pub(crate) rest_port: Option<u16>,
141
142    /// 带 Bearer Token(scope 模式下需要 acc:read scope)
143    #[arg(long)]
144    pub(crate) api_key: Option<String>,
145}
146
147#[derive(Args)]
148pub struct DoctorArgs {
149    /// 目标 REST 端点 URL(默认从 FUTU_REST_URL 环境变量读,或 http://127.0.0.1:22222)
150    #[arg(long)]
151    pub(crate) rest_url: Option<String>,
152
153    /// REST/MCP 风格用户习惯指定 port,自动转 http://127.0.0.1:<port>
154    #[arg(long, conflicts_with = "rest_url")]
155    pub(crate) rest_port: Option<u16>,
156
157    /// 带 Bearer Token(scope 模式下建议使用 admin + qot:read + metrics:read scope)
158    #[arg(long)]
159    pub(crate) api_key: Option<String>,
160
161    /// 可选 MARKET.CODE;提供后 doctor 会额外查询 market-state 和 quote-capability
162    /// 辅助判断闭市、开市断流、行情权限或静态缓存问题
163    #[arg(long)]
164    pub(crate) symbol: Option<String>,
165
166    /// 写出脱敏诊断包到指定目录(不存在则创建)
167    #[arg(long, value_name = "DIR")]
168    pub(crate) bundle: Option<PathBuf>,
169
170    /// 不检查公开 version.json;适合离线或严格内网环境
171    #[arg(long)]
172    pub(crate) no_update_check: bool,
173
174    /// version.json URL;默认读 FUTU_UPDATE_CHECK_URL,未设置则用 https://futuapi.com/version.json
175    #[arg(long)]
176    pub(crate) update_url: Option<String>,
177
178    /// 更新检查 HTTP 超时,单位毫秒
179    #[arg(long, default_value_t = 800)]
180    pub(crate) update_timeout_ms: u64,
181}
182
183#[derive(Args)]
184pub struct VersionArgs {
185    /// 请求公开 version.json 检查是否有新版本;默认只显示本地版本,不联网
186    #[arg(long)]
187    pub(crate) check: bool,
188
189    /// version.json URL;默认读 FUTU_UPDATE_CHECK_URL,未设置则用 https://futuapi.com/version.json
190    #[arg(long)]
191    pub(crate) url: Option<String>,
192
193    /// 更新检查 HTTP 超时,单位毫秒
194    #[arg(long, default_value_t = 800)]
195    pub(crate) timeout_ms: u64,
196}
197
198#[derive(Args)]
199pub struct LanguagePackArgs {
200    #[command(subcommand)]
201    pub(crate) command: LanguagePackCommand,
202}
203
204#[derive(Subcommand)]
205pub enum LanguagePackCommand {
206    /// 查看本地语言包 cache / fallback 状态
207    Status {
208        /// 语言包 cache 根目录;默认按 OS cache dir 或 FUTU_LANGUAGE_PACK_CACHE_DIR
209        #[arg(long, value_name = "DIR")]
210        cache_dir: Option<PathBuf>,
211    },
212    /// 从本地 Languages 目录导入 api_lang.ini / static_lang.ini
213    Import {
214        /// 包含 en/zh_cn 子目录的 Languages 根目录
215        #[arg(long, value_name = "DIR")]
216        dir: PathBuf,
217
218        /// 语言包 cache 根目录;默认按 OS cache dir 或 FUTU_LANGUAGE_PACK_CACHE_DIR
219        #[arg(long, value_name = "DIR")]
220        cache_dir: Option<PathBuf>,
221
222        /// 写入 manifest 的语言包版本
223        #[arg(long, default_value = "manual-import")]
224        pack_version: String,
225
226        /// 写入 manifest 的来源说明
227        #[arg(long, default_value = "manual-import")]
228        source: String,
229
230        /// 可选 profile/client_type 说明;仅用于复盘,不参与协议
231        #[arg(long)]
232        profile: Option<String>,
233    },
234    /// 从显式配置的 HTTPS endpoint 拉取语言包 manifest 并更新 last-good
235    Update {
236        /// manifest URL 或 endpoint 根目录。默认不配置、不联网
237        #[arg(long, value_name = "URL")]
238        endpoint: String,
239
240        /// 语言包 cache 根目录;默认按 OS cache dir 或 FUTU_LANGUAGE_PACK_CACHE_DIR
241        #[arg(long, value_name = "DIR")]
242        cache_dir: Option<PathBuf>,
243
244        /// HTTP 超时,单位毫秒
245        #[arg(long, default_value_t = 3000)]
246        timeout_ms: u64,
247
248        /// 可选语言过滤,逗号分隔:en,zh_cn
249        #[arg(long)]
250        lang: Option<String>,
251    },
252}
253
254#[derive(Args)]
255pub struct StaticStatusArgs {
256    /// 目标 REST 端点 URL(默认从 FUTU_REST_URL 环境变量读,或 http://127.0.0.1:22222)
257    #[arg(long)]
258    pub(crate) rest_url: Option<String>,
259
260    /// REST/MCP 风格用户习惯指定 port,自动转 http://127.0.0.1:<port>
261    #[arg(long, conflicts_with = "rest_url")]
262    pub(crate) rest_port: Option<u16>,
263
264    /// 带 Bearer Token(scope 模式下需要 admin scope 的 key)
265    #[arg(long)]
266    pub(crate) api_key: Option<String>,
267}
268
269#[derive(Args)]
270pub struct StaticWarmupArgs {
271    /// 需要显式 warmup 的股票代码,MARKET.CODE 格式,可多个
272    #[arg(required = true)]
273    pub(crate) symbols: Vec<String>,
274}
275
276#[derive(Args)]
277pub struct SurfaceArgs {
278    /// 只显示存在 NotExposed surface 的 endpoint
279    #[arg(long)]
280    pub(crate) gaps: bool,
281
282    /// 输出指定 endpoint 的新增/变更防漏 checklist;可传 canonical、REST path、MCP tool 或 CLI subcommand
283    #[arg(long, value_name = "ENDPOINT")]
284    pub(crate) checklist: Option<String>,
285}
286
287#[derive(Args)]
288pub struct DaemonShutdownArgs {
289    /// 目标 REST 端点 URL(默认从 FUTU_REST_URL 环境变量读,或 http://127.0.0.1:22222)
290    #[arg(long)]
291    pub(crate) rest_url: Option<String>,
292
293    /// v1.4.106 codex 0554 F5 [P3]: 风格一致性 — 与 daemon-status 对齐,
294    /// REST/MCP 风格用户习惯指定 port, 自动转 http://127.0.0.1:<port>.
295    #[arg(long, conflicts_with = "rest_url")]
296    pub(crate) rest_port: Option<u16>,
297
298    /// 带 Bearer Token(scope 模式下需要 admin scope 的 key)
299    #[arg(long)]
300    pub(crate) api_key: Option<String>,
301}
302
303#[derive(Args)]
304pub struct DaemonReloadArgs {
305    /// 目标 REST 端点 URL(默认从 FUTU_REST_URL 环境变量读,或 http://127.0.0.1:22222)
306    #[arg(long)]
307    pub(crate) rest_url: Option<String>,
308
309    /// v1.4.106 codex 0554 F5 [P3]: 风格一致性 — 与 daemon-status 对齐,
310    /// REST/MCP 风格用户习惯指定 port, 自动转 http://127.0.0.1:<port>.
311    #[arg(long, conflicts_with = "rest_url")]
312    pub(crate) rest_port: Option<u16>,
313
314    /// 带 Bearer Token(scope 模式下需要 admin scope 的 key)
315    #[arg(long)]
316    pub(crate) api_key: Option<String>,
317}