stock_rust/stocks/transforms/
netease.rs1use anyhow::{anyhow, Result};
2
3use crate::stocks::base::{COMMON_HK, COMMON_SH, COMMON_SZ, COMMON_US};
4
5use super::base::{ApiCodeTransform, CommonCodeTransform};
6
7const NETEASE_SZ: &str = "1";
8const NETEASE_SH: &str = "0";
9const NETEASE_HK: &str = "hk";
10const NETEASE_US: &str = "US_";
11
12pub struct NeteaseCommonCodeTransform;
13
14impl CommonCodeTransform for NeteaseCommonCodeTransform {
15 fn transform(&self, code: &str) -> Result<String> {
16 if code.starts_with(COMMON_SH) {
17 return self.sh_transform(code);
18 }
19 if code.starts_with(COMMON_SZ) {
20 return self.sz_transform(code);
21 }
22 if code.starts_with(COMMON_HK) {
23 return self.hk_transform(code);
24 }
25 if code.starts_with(COMMON_US) {
26 return self.us_transform(code);
27 }
28
29 Err(anyhow!("请检查统一代码是否正确"))
30 }
31
32 fn sz_transform(&self, code: &str) -> Result<String> {
33 if !code.contains(COMMON_SZ) {
34 return Err(anyhow!("请检查统一代码是否正确"));
35 }
36 Ok(format!("{}{}", NETEASE_SZ, code.replacen(COMMON_SZ, "", 1)))
37 }
38
39 fn sh_transform(&self, code: &str) -> Result<String> {
40 if !code.contains(COMMON_SH) {
41 return Err(anyhow!("请检查统一代码是否正确"));
42 }
43 Ok(format!("{}{}", NETEASE_SH, code.replacen(COMMON_SH, "", 1)))
44 }
45
46 fn hk_transform(&self, code: &str) -> Result<String> {
47 if !code.contains(COMMON_HK) {
48 return Err(anyhow!("请检查统一代码是否正确"));
49 }
50 Ok(format!("{}{}", NETEASE_HK, code.replacen(COMMON_HK, "", 1)))
51 }
52
53 fn us_transform(&self, code: &str) -> Result<String> {
54 if !code.contains(COMMON_US) {
55 return Err(anyhow!("请检查统一代码是否正确"));
56 }
57 Ok(format!("{}{}", NETEASE_US, code.replacen(COMMON_US, "", 1)))
58 }
59}
60
61pub struct NeteaseApiCodeTransform;
62
63impl ApiCodeTransform for NeteaseApiCodeTransform {
64 fn transform(&self, code: &str) -> Result<String> {
65 if code.starts_with(NETEASE_SZ) {
66 return self.sz_transform(code);
67 }
68 if code.starts_with(NETEASE_SH) {
69 return self.sh_transform(code);
70 }
71 if code.starts_with(NETEASE_HK) {
72 return self.hk_transform(code);
73 }
74 if code.starts_with(NETEASE_US) {
75 return self.us_transform(code);
76 }
77
78 Err(anyhow!("请检查股票代码是否正确"))
79 }
80
81 fn sz_transform(&self, code: &str) -> Result<String> {
82 if !code.starts_with(NETEASE_SZ) {
83 return Err(anyhow!("请检查股票代码是否正确"));
84 }
85 Ok(format!("{}{}", COMMON_SZ, code.replacen(NETEASE_SZ, "", 1)))
86 }
87
88 fn sh_transform(&self, code: &str) -> Result<String> {
89 if !code.contains(NETEASE_SH) {
90 return Err(anyhow!("请检查股票代码是否正确"));
91 }
92 Ok(format!("{}{}", COMMON_SH, code.replacen(NETEASE_SH, "", 1)))
93 }
94
95 fn hk_transform(&self, code: &str) -> Result<String> {
96 if !code.contains(NETEASE_HK) {
97 return Err(anyhow!("请检查股票代码是否正确"));
98 }
99 Ok(format!("{}{}", COMMON_HK, code.replacen(NETEASE_HK, "", 1)))
100 }
101
102 fn us_transform(&self, code: &str) -> Result<String> {
103 if !code.contains(NETEASE_US) {
104 return Err(anyhow!("请检查股票代码是否正确"));
105 }
106 Ok(format!("{}{}", COMMON_US, code.replacen(NETEASE_US, "", 1)))
107 }
108}
109
110pub struct NeteaseSearchCodeTransform;
111
112impl NeteaseSearchCodeTransform {
113 pub fn transform(&self, tag: &str, tp: &str, symbol: &str) -> String {
114 if tag.contains(COMMON_SZ) || tp.contains(COMMON_SZ) {
115 return format!("{}{}", COMMON_SZ, symbol);
116 }
117 if tag.contains(COMMON_SH) || tp.contains(COMMON_SH) {
118 return format!("{}{}", COMMON_SH, symbol);
119 }
120 String::new()
121 }
122}
123
124#[cfg(test)]
125mod tests {
126 use super::*;
127
128 #[test]
129 fn test_common_code_transform() {
130 let t = NeteaseCommonCodeTransform;
131 assert_eq!(t.transform("SH510500").unwrap(), "0510500");
132 assert_eq!(t.transform("SZ399001").unwrap(), "1399001");
133 assert_eq!(t.transform("HKHSI").unwrap(), "hkHSI");
134 assert_eq!(t.transform("USDJI").unwrap(), "US_DJI");
135 }
136
137 #[test]
138 fn test_api_code_transform() {
139 let t = NeteaseApiCodeTransform;
140 assert_eq!(t.transform("0510500").unwrap(), "SH510500");
141 assert_eq!(t.transform("1399001").unwrap(), "SZ399001");
142 assert_eq!(t.transform("hkHSI").unwrap(), "HKHSI");
143 assert_eq!(t.transform("US_DJI").unwrap(), "USDJI");
144 }
145
146 #[test]
147 fn test_search_code_transform() {
148 let t = NeteaseSearchCodeTransform;
149 assert_eq!(t.transform("", "SZ", "399001"), "SZ399001");
150 assert_eq!(t.transform("SH", "", "510500"), "SH510500");
151 assert_eq!(t.transform("", "US", "DJI"), "");
152 }
153}