Skip to main content

stock_rust/stocks/transforms/
netease.rs

1use 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}