use crate::client::AkShareClient;
use crate::error::{Error, Result};
use crate::types::CandlePoint;
fn etf_secid(symbol: &str) -> Result<String> {
let s = symbol.trim();
if s.contains('.') && s.len() >= 3 {
return Ok(s.to_string());
}
if s.len() == 6 && s.chars().all(|c| c.is_ascii_digit()) {
let prefix = if s.starts_with('5') || s.starts_with('5') {
"1" } else if s.starts_with('1') {
"0" } else {
"1" };
return Ok(format!("{prefix}.{s}"));
}
Err(Error::invalid_input(format!(
"invalid ETF symbol: {symbol}"
)))
}
impl AkShareClient {
pub async fn fund_etf_hist(&self, symbol: &str, limit: usize) -> Result<Vec<CandlePoint>> {
let secid = etf_secid(symbol)?;
self.eastmoney_klines(&secid, "qfq", limit).await
}
}