use crate::model::response::common::FigiResult;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct SearchData {
pub data: Vec<FigiResult>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next: Option<String>,
}
impl SearchData {
#[must_use]
pub fn data(&self) -> &[FigiResult] {
&self.data
}
#[must_use]
pub fn next_page(&self) -> Option<&str> {
self.next.as_deref()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{model::response::ResponseResult, test_utils::load_test_data};
pub type SearchResponse = ResponseResult<SearchData>;
#[test]
fn test_deserialize_query_example() {
let json_str = load_test_data("search", "query_example.json");
let search_response: SearchResponse = serde_json::from_str(&json_str).unwrap();
let search_data = match search_response {
ResponseResult::Success(ref data) => data,
ResponseResult::Error(ref err) => panic!("Expected success, got error: {err:?}"),
};
let figi_result = search_data.data();
assert!(!figi_result.is_empty());
let first_entry = &figi_result[0];
assert_eq!(first_entry.figi, "BBG0002ZTPP5");
assert_eq!(first_entry.ticker, Some("IBM 03/20/10 P130".to_string()));
assert_eq!(first_entry.display_name(), "March 10 Puts on IBM US");
assert!(first_entry.has_composite_figi());
assert!(!first_entry.has_share_class_figi());
assert_eq!(first_entry.composite_figi, Some("BBG0002ZTPP5".to_string()));
assert_eq!(first_entry.share_class_figi, None);
assert!(search_data.next_page().is_some());
}
#[test]
fn test_deserialize_no_data() {
let json_str = load_test_data("search", "no_data.json");
let search_response: SearchResponse = serde_json::from_str(&json_str).unwrap();
let figi_result = match search_response {
ResponseResult::Success(ref data) => data.data(),
ResponseResult::Error(ref err) => panic!("Expected success, got error: {err:?}"),
};
assert!(figi_result.is_empty());
}
}