1use dotenvy::dotenv;
2use std::env;
3
4#[derive(Debug, Clone)]
6pub struct CtpConfig {
7 pub md_front_address: String,
8 pub trader_front_address: String,
9 pub broker_id: String,
10 pub investor_id: String,
11 pub password: String,
12 pub flow_path: String,
13 pub instruments: Vec<String>,
14 pub app_id: String,
15 pub auth_code: String,
16 pub product_info: String,
17}
18
19impl CtpConfig {
20 pub fn from_env() -> Result<Self, Box<dyn std::error::Error>> {
22 dotenv().ok();
23
24 let md_front_address = env::var("MD_FRONT_ADDRESS")
25 .unwrap_or_else(|_| "tcp://121.37.80.177:20004".to_string());
26 let trader_front_address = env::var("TRADER_FRONT_ADDRESS")
27 .unwrap_or_else(|_| "tcp://121.37.80.177:20002".to_string());
28 let broker_id = env::var("BROKER_ID").unwrap_or_else(|_| "9999".to_string());
29 let investor_id =
30 env::var("INVESTOR_ID").map_err(|_| "请在.env文件中设置INVESTOR_ID环境变量")?;
31 let password = env::var("PASSWORD").map_err(|_| "请在.env文件中设置PASSWORD环境变量")?;
32 let flow_path = env::var("FLOW_PATH").unwrap_or_else(|_| "./flow".to_string());
33 let instruments_str = env::var("INSTRUMENTS").unwrap_or_else(|_| "rb2601".to_string());
34 let instruments: Vec<String> = instruments_str
35 .split(',')
36 .map(|s| s.trim().to_string())
37 .filter(|s| !s.is_empty())
38 .collect();
39
40 let app_id = env::var("APP_ID").unwrap_or_else(|_| "".to_string());
41 let auth_code = env::var("AUTH_CODE").unwrap_or_else(|_| "".to_string());
42 let product_info = env::var("PRODUCT_INFO").unwrap_or_else(|_| "".to_string());
43
44 Ok(CtpConfig {
45 md_front_address,
46 trader_front_address,
47 broker_id,
48 investor_id,
49 password,
50 flow_path,
51 instruments,
52 app_id,
53 auth_code,
54 product_info,
55 })
56 }
57}