1use crate::handlers;
4use crate::tool_args::*;
5use rmcp::{RoleServer, handler::server::wrapper::Parameters, service::RequestContext};
6
7use super::FutuServer;
8
9impl FutuServer {
10 async fn futu_get_shareholders_overview_impl(
11 &self,
12 Parameters(req): Parameters<ShareholdersOverviewReq>,
13 req_ctx: RequestContext<RoleServer>,
14 ) -> std::result::Result<String, String> {
15 tracing::info!(
16 tool = "futu_get_shareholders_overview",
17 symbol = %req.symbol,
18 period_id = ?req.period_id
19 );
20 let client = self
21 .read_client_or_err("futu_get_shareholders_overview", &req_ctx, None, None)
22 .await?;
23 Self::wrap_result(
24 handlers::reference::get_shareholders_overview(&client, &req.symbol, req.period_id)
25 .await,
26 )
27 }
28
29 async fn futu_get_shareholders_holding_changes_impl(
30 &self,
31 Parameters(req): Parameters<ShareholdersHoldingChangesReq>,
32 req_ctx: RequestContext<RoleServer>,
33 ) -> std::result::Result<String, String> {
34 req.validate()?;
35 tracing::info!(
36 tool = "futu_get_shareholders_holding_changes",
37 symbol = %req.symbol,
38 next_key = ?req.next_key,
39 num = ?req.num,
40 sort_type = ?req.sort_type,
41 sort_column = ?req.sort_column,
42 filter_type = ?req.filter_type
43 );
44 let client = self
45 .read_client_or_err(
46 "futu_get_shareholders_holding_changes",
47 &req_ctx,
48 None,
49 None,
50 )
51 .await?;
52 Self::wrap_result(
53 handlers::reference::get_shareholders_holding_changes(
54 &client,
55 &req.symbol,
56 req.next_key,
57 req.num,
58 req.sort_type,
59 req.sort_column,
60 req.filter_type,
61 )
62 .await,
63 )
64 }
65
66 async fn futu_get_shareholders_holder_detail_impl(
67 &self,
68 Parameters(req): Parameters<ShareholdersHolderDetailReq>,
69 req_ctx: RequestContext<RoleServer>,
70 ) -> std::result::Result<String, String> {
71 req.validate()?;
72 tracing::info!(
73 tool = "futu_get_shareholders_holder_detail",
74 symbol = %req.symbol,
75 request_type = ?req.request_type,
76 next_key = ?req.next_key,
77 num = ?req.num,
78 sort_column = ?req.sort_column,
79 sort_type = ?req.sort_type,
80 period_id = ?req.period_id,
81 holder_id = ?req.holder_id
82 );
83 let client = self
84 .read_client_or_err("futu_get_shareholders_holder_detail", &req_ctx, None, None)
85 .await?;
86 Self::wrap_result(
87 handlers::reference::get_shareholders_holder_detail(
88 &client,
89 &req.symbol,
90 req.request_type,
91 req.next_key,
92 req.num,
93 req.sort_column,
94 req.sort_type,
95 req.period_id,
96 req.holder_id,
97 )
98 .await,
99 )
100 }
101
102 async fn futu_get_shareholders_institutional_impl(
103 &self,
104 Parameters(req): Parameters<ShareholdersInstitutionalReq>,
105 req_ctx: RequestContext<RoleServer>,
106 ) -> std::result::Result<String, String> {
107 req.validate()?;
108 tracing::info!(
109 tool = "futu_get_shareholders_institutional",
110 symbol = %req.symbol,
111 next_key = ?req.next_key,
112 num = ?req.num
113 );
114 let client = self
115 .read_client_or_err("futu_get_shareholders_institutional", &req_ctx, None, None)
116 .await?;
117 Self::wrap_result(
118 handlers::reference::get_shareholders_institutional(
119 &client,
120 &req.symbol,
121 req.next_key,
122 req.num,
123 )
124 .await,
125 )
126 }
127
128 async fn futu_get_insider_holder_list_impl(
129 &self,
130 Parameters(req): Parameters<InsiderHolderListReq>,
131 req_ctx: RequestContext<RoleServer>,
132 ) -> std::result::Result<String, String> {
133 req.validate()?;
134 tracing::info!(
135 tool = "futu_get_insider_holder_list",
136 symbol = %req.symbol,
137 next_key = ?req.next_key,
138 num = ?req.num
139 );
140 let client = self
141 .read_client_or_err("futu_get_insider_holder_list", &req_ctx, None, None)
142 .await?;
143 Self::wrap_result(
144 handlers::reference::get_insider_holder_list(
145 &client,
146 &req.symbol,
147 req.next_key,
148 req.num,
149 )
150 .await,
151 )
152 }
153
154 async fn futu_get_insider_trade_list_impl(
155 &self,
156 Parameters(req): Parameters<InsiderTradeListReq>,
157 req_ctx: RequestContext<RoleServer>,
158 ) -> std::result::Result<String, String> {
159 req.validate()?;
160 tracing::info!(
161 tool = "futu_get_insider_trade_list",
162 symbol = %req.symbol,
163 holder_id = ?req.holder_id,
164 next_key = ?req.next_key,
165 num = ?req.num
166 );
167 let client = self
168 .read_client_or_err("futu_get_insider_trade_list", &req_ctx, None, None)
169 .await?;
170 Self::wrap_result(
171 handlers::reference::get_insider_trade_list(
172 &client,
173 &req.symbol,
174 req.holder_id,
175 req.next_key,
176 req.num,
177 )
178 .await,
179 )
180 }
181}
182
183include!(concat!(
184 env!("OUT_DIR"),
185 "/generated_mcp_routes_reference_shareholders_insider.rs"
186));