env_usage/
env_usage.rs

1use tushare_api::{TushareClient, TushareRequest, Api, TushareResult, params, fields};
2use std::time::Duration;
3
4#[tokio::main]
5async fn main() -> TushareResult<()> {
6    println!("=== 使用环境变量 TUSHARE_TOKEN 创建客户端 ===");
7    
8    // 从环境变量创建客户端(使用默认超时设置)
9    let client = match TushareClient::from_env() {
10        Ok(client) => {
11            println!("✅ 成功从环境变量 TUSHARE_TOKEN 创建客户端");
12            client
13        }
14        Err(e) => {
15            eprintln!("❌ 无法从环境变量创建客户端: {}", e);
16            eprintln!("请确保设置了环境变量 TUSHARE_TOKEN");
17            eprintln!("例如: export TUSHARE_TOKEN=your_token_here");
18            return Err(e);
19        }
20    };
21    
22    // 使用宏构建请求(支持直接使用字符串字面量)
23    let request = TushareRequest {
24        api_name: Api::StockBasic,
25        params: params!("list_status" => "L"),
26        fields: fields!["ts_code", "name", "industry", "area"],
27    };
28    
29    // 调用 API
30    match client.call_api(&request).await {
31        Ok(response) => {
32            if let Some(data) = response.data {
33                println!("✅ 成功获取到 {} 条记录", data.items.len());
34
35                // 显示前5条记录
36                println!("\n前5条股票信息:");
37                for (i, item) in data.items.iter().take(5).enumerate() {
38                    println!("{}. {:?}", i + 1, item);
39                }
40            }
41        }
42        Err(e) => {
43            eprintln!("❌ 获取股票列表失败: {}", e);
44        }
45    }
46    
47    println!("\n=== 使用环境变量和自定义超时设置 ===");
48    
49    // 从环境变量创建客户端(自定义超时设置)
50    let client_with_timeout = TushareClient::from_env_with_timeout(
51        Duration::from_secs(5),  // 连接超时 5 秒
52        Duration::from_secs(60)  // 请求超时 60 秒
53    )?;
54    
55    println!("\n=== 演示自定义 API 调用 ===\n");
56    
57    let custom_request = TushareRequest {
58        api_name: Api::Custom("daily".to_string()),
59        params: params!("ts_code" => "000001.SZ"),
60        fields: fields!["ts_code", "trade_date", "close"],
61    };
62    
63    match client_with_timeout.call_api(&custom_request).await {
64        Ok(response) => {
65            if let Some(data) = response.data {
66                if let Some(item) = data.items.first() {
67                    println!("✅ 找到股票信息:");
68                    for (field, value) in data.fields.iter().zip(item.iter()) {
69                        println!("  {}: {}", field, value);
70                    }
71                } else {
72                    println!("未找到该股票");
73                }
74            }
75        }
76        Err(e) => {
77            eprintln!("❌ 查询股票失败: {}", e);
78        }
79    }
80
81    Ok(())
82}