use serde::{Deserialize, Serialize};
use crate::client::Client;
const QUERY_FETCH_CHART_MARKUPS: &str = include_str!("graphql/fetch_chart_markups.graphql");
#[derive(Default, Serialize)]
#[serde(rename_all = "camelCase")]
struct FetchChartMarkupsVariables {
site: String,
dow_jones_key: String,
#[serde(skip_serializing_if = "Option::is_none")]
frequency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
sort_dir: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
date_start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
date_end: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
cursor_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
limit: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FetchChartMarkupsResponse {
pub user: Option<FetchChartMarkupsUser>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FetchChartMarkupsUser {
pub chart_markups: Option<FetchChartMarkupsList>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FetchChartMarkupsList {
pub cursor_id: Option<String>,
#[serde(default)]
pub chart_markups: Vec<FetchChartMarkup>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FetchChartMarkup {
pub created_at: Option<String>,
pub data: Option<String>,
pub frequency: Option<String>,
pub id: Option<String>,
pub name: Option<String>,
pub site: Option<String>,
pub updated_at: Option<String>,
}
impl Client {
pub async fn fetch_chart_markups(
&self,
site: &str,
dow_jones_key: &str,
frequency: Option<&str>,
sort_dir: Option<&str>,
) -> crate::error::Result<FetchChartMarkupsResponse> {
let variables = FetchChartMarkupsVariables {
site: site.to_string(),
dow_jones_key: dow_jones_key.to_string(),
frequency: frequency.map(ToString::to_string),
sort_dir: sort_dir.map(ToString::to_string),
date_start: None,
date_end: None,
cursor_id: None,
limit: None,
};
self.graphql_operation("FetchChartMarkups", variables, QUERY_FETCH_CHART_MARKUPS)
.await
}
}
#[cfg(test)]
mod tests {
use crate::test_support::mock_test;
#[tokio::test]
async fn fetch_chart_markups_parses_response() {
let (_server, client, mock) = mock_test("FetchChartMarkups").await;
let resp = client
.fetch_chart_markups("marketsurge", "13-5320", None, None)
.await
.expect("fetch_chart_markups should succeed");
let user = resp.user.as_ref().expect("user");
let list = user.chart_markups.as_ref().expect("chart_markups");
assert_eq!(list.cursor_id.as_deref(), Some("cursor-abc123"));
assert_eq!(list.chart_markups.len(), 2);
let first = &list.chart_markups[0];
assert_eq!(first.id.as_deref(), Some("markup-001"));
assert_eq!(first.name.as_deref(), Some("My Trend Lines"));
assert_eq!(first.frequency.as_deref(), Some("DAILY"));
assert!(first.data.is_some());
let second = &list.chart_markups[1];
assert_eq!(second.id.as_deref(), Some("markup-002"));
assert!(second.name.is_none());
assert!(second.updated_at.is_none());
mock.assert();
}
#[cfg(not(coverage))]
#[tokio::test]
#[ignore]
async fn integration_fetch_chart_markups() {
let client = crate::test_support::live_client().await;
let resp = client
.fetch_chart_markups("marketsurge", "13-5320", None, None)
.await
.expect("live fetch_chart_markups should succeed");
assert!(resp.user.is_some());
}
}