use crate::error::{ParseError, Result};
use crate::types::activity::FlexQueryResponse;
use crate::types::ActivityFlexStatement;
pub fn parse_activity_flex(xml: &str) -> Result<ActivityFlexStatement> {
let response: FlexQueryResponse =
quick_xml::de::from_str(xml).map_err(|e| ParseError::XmlError {
message: format!("Failed to parse FLEX XML: {}", e),
location: None,
})?;
let statement = response
.statements
.statements
.into_iter()
.next()
.ok_or_else(|| ParseError::MissingField {
field: "FlexStatement".to_string(),
context: "FlexQueryResponse".to_string(),
})?;
Ok(statement)
}
pub fn parse_activity_flex_all(xml: &str) -> Result<Vec<ActivityFlexStatement>> {
let response: FlexQueryResponse =
quick_xml::de::from_str(xml).map_err(|e| ParseError::XmlError {
message: format!("Failed to parse FLEX XML: {}", e),
location: None,
})?;
Ok(response.statements.statements)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_minimal_activity() {
let xml = include_str!("../../tests/fixtures/activity_minimal.xml");
let result = parse_activity_flex(xml);
match &result {
Ok(statement) => {
assert_eq!(statement.account_id, "U1234567");
let trades = &statement.trades.items;
assert!(!trades.is_empty());
assert_eq!(trades[0].symbol, "AAPL");
}
Err(e) => {
panic!("Parse failed: {}", e);
}
}
}
}