qifi_rs/func.rs
1// 此库提供好用的API以提供数据转换功能
2use bson::{from_bson, Bson, Document};
3use serde::de::DeserializeOwned;
4use serde_json::{Error, Value};
5// use mongodb::Cursor;
6use serde::Serialize;
7
8
9/// 此处为了描述如何从bson数据载入为可用的结构体,传入一个bson以使用它
10pub fn from_bson_(data: Bson) -> Option<Bson> {
11 from_bson(data).unwrap()
12}
13
14/// 将Value值转换成已经实现了Deserialized的struct
15/// Examples
16/// ```
17/// use qifi_rs::{QIFI, from_string, from_serde_value};
18/// use serde_json::Value;
19/// let qifi_string = r#"{"account_cookie": "T01B2_IF2004_1min", "password": "T01B2_IF2004_1min", "accounts": {"user_id": "T01B2_IF2004_1min", "currency": "CNY", "pre_balance": 1000000, "deposit": 0, "withdraw": 0, "WithdrawQuota": 0, "close_profit": 0, "commission": 0, "premium": 1330, "static_balance": 1000000, "position_profit": 0, "float_profit": 0, "balance": 1000000, "margin": 0, "frozen_margin": 0, "frozen_commission": 0.0, "frozen_premium": 0.0, "available": 1000000, "risk_ratio": 0.0}, "bank_password": "", "bankid": "QASIM", "bankname": "QASIMBank", "banks": {"QASIM": {"id": "QASIM", "name": "QASIMBank", "bank_account": "", "fetch_amount": 0.0, "qry_count": 0}}, "broker_name": "QAPaperTrading", "capital_password": "", "databaseip": "", "events": {}, "frozen": {}, "investor_name": "", "model": "SIM", "money": 1000000, "orders": {}, "ping_gap": 5, "portfolio": "QAPaperTrade", "positions": {}, "pub_host": "", "settlement": {}, "sourceid": "QIFI_Account", "status": 200, "taskid": "", "trade_host": "", "trades": {}, "trading_day": "2020-03-26", "transfers": {}, "updatetime": "", "wsuri": "ws://www.yutiansut.com:7988"}"#;
20/// let string = String::from(qifi_string);
21/// let qifi: Value = from_string(string).unwrap();
22/// let qifi_struct: QIFI = from_serde_value(qifi).unwrap();
23/// let _deserialize = serde_json::to_string(&qifi_struct).expect("呀 反序列化失败,请检查你的字符串格式");
24/// ```
25///
26pub fn from_serde_value<T>(value: Value) -> Result<T, Error>
27 where
28 T: DeserializeOwned,
29{
30 T::deserialize(value)
31}
32
33/// 2020-3-27 14:01 @somewheve
34/// 将String转换为Value类型的数据 你需要合理的处理这个问题
35/// 出于你可能想对自己的数据格式进行修改考虑,我在此仅仅返回了Option<Value>,方便你进行自己的处理
36/// 你仍然可以使用我们提供的from_serde_value或者serde_json::from_value来进行转换成struct.
37/// ps: 他们是一样,取决于你想不想再导入serde_json
38/// Examples
39/// ```
40/// use qifi_rs::from_string;
41/// use serde_json::Value;
42/// let qifi_string = r#"{"account_cookie": "T01B2_IF2004_1min", "password": "T01B2_IF2004_1min", "accounts": {"user_id": "T01B2_IF2004_1min", "currency": "CNY", "pre_balance": 1000000, "deposit": 0, "withdraw": 0, "WithdrawQuota": 0, "close_profit": 0, "commission": 0, "premium": 1330, "static_balance": 1000000, "position_profit": 0, "float_profit": 0, "balance": 1000000, "margin": 0, "frozen_margin": 0, "frozen_commission": 0.0, "frozen_premium": 0.0, "available": 1000000, "risk_ratio": 0.0}, "bank_password": "", "bankid": "QASIM", "bankname": "QASIMBank", "banks": {"QASIM": {"id": "QASIM", "name": "QASIMBank", "bank_account": "", "fetch_amount": 0.0, "qry_count": 0}}, "broker_name": "QAPaperTrading", "capital_password": "", "databaseip": "", "event": {}, "frozen": {}, "investor_name": "", "model": "SIM", "money": 1000000, "orders": {}, "ping_gap": 5, "portfolio": "QAPaperTrade", "positions": {}, "pub_host": "", "settlement": {}, "sourceid": "QIFI_Account", "status": 200, "taskid": "", "trade_host": "", "trades": {}, "trading_day": "2020-03-26", "transfers": {}, "updatetime": "", "wsuri": "ws://www.yutiansut.com:7988"}"#;
43/// let string = String::from(qifi_string);
44/// let qifi: Value = from_string(string).unwrap();
45/// let _deserialize = serde_json::to_string(&qifi).expect("呀 反序列化失败,请检查你的字符串格式");
46///```
47pub fn from_string(data: String) -> Option<Value> {
48 let solve = data.replace("null", "\"qifi_default\"");
49 // println!("{:#?}", solve);
50 match serde_json::from_str(&solve) {
51 Ok(_t) => _t,
52 Err(_e) => None,
53 }
54}
55
56/// 2020-3-27 14:16 @somewheve
57/// 将&str转换为Value类型的数据, 在出现错误的时候返回一个None, 你需要合理的处理这个问题
58/// 出于你可能想对自己的数据格式进行修改考虑,我在此仅仅返回了Option<Value>,方便你进行自己的处理
59/// 你仍然可以使用我们提供的from_serde_value或者serde_json::from_value来进行转换成struct.
60/// ps: 他们是一样,取决于你想不想再导入serde_json户
61/// Examples
62/// ```
63/// use qifi_rs::from_str;
64/// use serde_json::Value;
65/// let qifi_string = r#"{"account_cookie": "T01B2_IF2004_1min", "password": "T01B2_IF2004_1min", "accounts": {"user_id": "T01B2_IF2004_1min", "currency": "CNY", "pre_balance": 1000000, "deposit": 0, "withdraw": 0, "WithdrawQuota": 0, "close_profit": 0, "commission": 0, "premium": 1330, "static_balance": 1000000, "position_profit": 0, "float_profit": 0, "balance": 1000000, "margin": 0, "frozen_margin": 0, "frozen_commission": 0.0, "frozen_premium": 0.0, "available": 1000000, "risk_ratio": 0.0}, "bank_password": "", "bankid": "QASIM", "bankname": "QASIMBank", "banks": {"QASIM": {"id": "QASIM", "name": "QASIMBank", "bank_account": "", "fetch_amount": 0.0, "qry_count": 0}}, "broker_name": "QAPaperTrading", "capital_password": "", "databaseip": "", "event": {}, "frozen": {}, "investor_name": "", "model": "SIM", "money": 1000000, "orders": {}, "ping_gap": 5, "portfolio": "QAPaperTrade", "positions": {}, "pub_host": "", "settlement": {}, "sourceid": "QIFI_Account", "status": 200, "taskid": "", "trade_host": "", "trades": {}, "trading_day": "2020-03-26", "transfers": {}, "updatetime": "", "wsuri": "ws://www.yutiansut.com:7988"}"#;
66/// let qifi: Value = from_str(qifi_string).unwrap();
67/// let _deserialize = serde_json::to_string(&qifi).expect("呀 反序列化失败,请检查你的字符串格式");
68/// ```
69pub fn from_str(data: &str) -> Option<Value> {
70 let solve = data.replace("null", "\"qifi_default\"");
71 match serde_json::from_str(&solve) {
72 Ok(_t) => _t,
73 Err(_e) => None,
74 }
75}
76
77// /// 此API用于快速将读取出来的数据转换为json字符串,注意是单个
78// pub fn covert_cursors_to_json(cursor: Cursor) -> String {
79// let docs: Vec<_> = cursor.map(|doc| doc.unwrap()).collect();
80// serde_json::to_string(&docs).unwrap()
81// }
82//
83// /// 转换单条数据,
84// pub fn covert_cursor_to_json(cursor: Cursor) -> String {
85// let docs: Vec<_> = cursor.map(|doc| doc.unwrap()).collect()[0];
86// serde_json::to_string(&docs).unwrap()
87// }
88
89
90/// 将结构体转换可以直接插入的doc参数
91/// Note: 注意你的数据类型中尽量不要使用 **u8等数据类型**,他会导致bson无法解析结构体. 参见 https://github.com/mongodb/bson-rust/issues/89
92/// Examples
93/// ```
94/// use qifi_rs::to_doc;
95/// use serde::{Deserialize, Serialize};
96/// #[derive(Serialize, Clone, Deserialize, Debug)]
97/// struct Name {
98/// hello:String
99/// }
100/// let x = to_doc(Name{ hello:"somewheve".to_string()});
101/// println!("{:?}", x)
102///
103/// ```
104pub fn to_doc<T>(value: T) -> Document
105 where
106 T: Serialize + std::fmt::Debug
107{
108 // println!("{:?}", value);
109 let serialized = bson::to_bson(&value).unwrap(); // Serialize
110 let x = serialized.as_document().expect("期望一个合法的document");
111 x.to_owned()
112}