1use std::collections::BTreeMap;
2
3use crate::error::{Error, ErrorKind};
4use crate::scanner::Ticker;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct SymbolFailure {
8 pub symbol: Ticker,
9 pub kind: ErrorKind,
10 pub message: String,
11 pub retryable: bool,
12}
13
14impl SymbolFailure {
15 pub fn from_error(symbol: Ticker, error: Error) -> Self {
16 let kind = error.kind();
17 let retryable = error.is_retryable();
18 Self {
19 symbol,
20 kind,
21 message: error.to_string(),
22 retryable,
23 }
24 }
25}
26
27#[derive(Debug, Clone, PartialEq)]
28pub struct BatchResult<T> {
29 pub successes: BTreeMap<Ticker, T>,
30 pub missing: Vec<Ticker>,
31 pub failures: Vec<SymbolFailure>,
32}
33
34impl<T> Default for BatchResult<T> {
35 fn default() -> Self {
36 Self {
37 successes: BTreeMap::new(),
38 missing: Vec::new(),
39 failures: Vec::new(),
40 }
41 }
42}
43
44impl<T> BatchResult<T> {
45 pub fn is_empty(&self) -> bool {
46 self.successes.is_empty() && self.missing.is_empty() && self.failures.is_empty()
47 }
48
49 pub fn len(&self) -> usize {
50 self.successes.len() + self.missing.len() + self.failures.len()
51 }
52}