mirror of
https://github.com/0xrsydn/idx-cli.git
synced 2026-08-07 01:33:52 +00:00
fix(api): reject empty ticker in resolve_symbol()
- Change resolve_symbol return type from String to Result<String, IdxError> - Add early validation for empty/whitespace-only ticker input - Return Err(IdxError::InvalidInput) for empty tickers - Add InvalidInput variant to IdxError enum - Update all 15 callers in cli/stocks.rs to handle Result with ? propagation - Update tests: empty/whitespace tickers now return error Fixes #7
This commit is contained in:
parent
bd4f3d49cc
commit
cd4d8d8323
3 changed files with 37 additions and 23 deletions
|
|
@ -62,15 +62,20 @@ pub trait NewsProvider {
|
|||
fn news(&self, symbol: &str, limit: usize) -> Result<Vec<NewsItem>, IdxError>;
|
||||
}
|
||||
|
||||
pub fn resolve_symbol(symbol: &str, exchange: &str) -> String {
|
||||
pub fn resolve_symbol(symbol: &str, exchange: &str) -> Result<String, IdxError> {
|
||||
let trimmed = symbol.trim().to_uppercase();
|
||||
if trimmed.is_empty() {
|
||||
return Err(IdxError::InvalidInput(
|
||||
"ticker symbol cannot be empty".into(),
|
||||
));
|
||||
}
|
||||
if let Some((base, suffix)) = trimmed.rsplit_once('.')
|
||||
&& !base.is_empty()
|
||||
&& !suffix.is_empty()
|
||||
{
|
||||
return trimmed;
|
||||
return Ok(trimmed);
|
||||
}
|
||||
format!("{trimmed}.{}", exchange.trim().to_uppercase())
|
||||
Ok(format!("{trimmed}.{}", exchange.trim().to_uppercase()))
|
||||
}
|
||||
|
||||
pub fn default_provider(provider: ProviderKind, verbose: bool) -> Box<dyn MarketDataProvider> {
|
||||
|
|
@ -224,11 +229,16 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn resolves_symbol_variants() {
|
||||
assert_eq!(resolve_symbol("bbca", "JK"), "BBCA.JK");
|
||||
assert_eq!(resolve_symbol("BBCA.JK", "JK"), "BBCA.JK");
|
||||
assert_eq!(resolve_symbol("TLKM.us", "JK"), "TLKM.US");
|
||||
assert_eq!(resolve_symbol("abcd.ef.gh", "JK"), "ABCD.EF.GH");
|
||||
assert_eq!(resolve_symbol(" bbri ", "jk"), "BBRI.JK");
|
||||
assert_eq!(resolve_symbol("", "JK"), ".JK");
|
||||
assert_eq!(resolve_symbol("bbca", "JK").unwrap(), "BBCA.JK");
|
||||
assert_eq!(resolve_symbol("BBCA.JK", "JK").unwrap(), "BBCA.JK");
|
||||
assert_eq!(resolve_symbol("TLKM.us", "JK").unwrap(), "TLKM.US");
|
||||
assert_eq!(resolve_symbol("abcd.ef.gh", "JK").unwrap(), "ABCD.EF.GH");
|
||||
assert_eq!(resolve_symbol(" bbri ", "jk").unwrap(), "BBRI.JK");
|
||||
// Empty ticker should return error
|
||||
assert!(resolve_symbol("", "JK").is_err());
|
||||
// Whitespace-only ticker should also return error
|
||||
assert!(resolve_symbol(" ", "JK").is_err());
|
||||
// Valid ticker returns Ok
|
||||
assert_eq!(resolve_symbol("BBCA", "JK").unwrap(), "BBCA.JK");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue