use serde::{Deserialize, Serialize};
use crate::error::Result;
use super::build_client;
use super::models::PaginatedResponse;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AnalystRating {
pub ticker: Option<String>,
pub analyst: Option<String>,
pub analyst_firm: Option<String>,
pub action: Option<String>,
pub rating: Option<String>,
pub prior_rating: Option<String>,
pub target_price: Option<f64>,
pub prior_target_price: Option<f64>,
pub date: Option<String>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AnalystInsight {
pub ticker: Option<String>,
pub analyst: Option<String>,
pub analyst_firm: Option<String>,
pub insight_type: Option<String>,
pub rating: Option<String>,
pub rationale: Option<String>,
pub target_price: Option<f64>,
pub date: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AnalystDetail {
pub analyst_name: Option<String>,
pub firm_name: Option<String>,
pub analyst_id: Option<String>,
pub firm_id: Option<String>,
pub ratings_count: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BullBear {
pub ticker: Option<String>,
pub bull_case: Option<String>,
pub bear_case: Option<String>,
pub date: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ConsensusRating {
pub ticker: Option<String>,
pub buy: Option<u32>,
pub hold: Option<u32>,
pub sell: Option<u32>,
pub strong_buy: Option<u32>,
pub strong_sell: Option<u32>,
pub target_price: Option<f64>,
pub target_high: Option<f64>,
pub target_low: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct CorporateGuidance {
pub ticker: Option<String>,
pub eps_guidance: Option<f64>,
pub revenue_guidance: Option<f64>,
pub period: Option<String>,
pub date: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct EarningsAnnouncement {
pub ticker: Option<String>,
pub name: Option<String>,
pub date: Option<String>,
pub quarter: Option<String>,
pub eps_actual: Option<f64>,
pub eps_estimate: Option<f64>,
pub revenue_actual: Option<f64>,
pub revenue_estimate: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FirmDetail {
pub name: Option<String>,
pub id: Option<String>,
pub analysts_count: Option<u32>,
}
pub async fn analyst_ratings(params: &[(&str, &str)]) -> Result<PaginatedResponse<AnalystRating>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/analyst-ratings", params)
.await
}
pub async fn analyst_insights(
params: &[(&str, &str)],
) -> Result<PaginatedResponse<AnalystInsight>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/analyst-insights", params)
.await
}
pub async fn analyst_details(params: &[(&str, &str)]) -> Result<PaginatedResponse<AnalystDetail>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/analyst-details", params)
.await
}
pub async fn bulls_bears(params: &[(&str, &str)]) -> Result<PaginatedResponse<BullBear>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/bulls-bears-say", params)
.await
}
pub async fn consensus_ratings(
params: &[(&str, &str)],
) -> Result<PaginatedResponse<ConsensusRating>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/consensus-ratings", params)
.await
}
pub async fn corporate_guidance(
params: &[(&str, &str)],
) -> Result<PaginatedResponse<CorporateGuidance>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/corporate-guidance", params)
.await
}
pub async fn benzinga_earnings(
params: &[(&str, &str)],
) -> Result<PaginatedResponse<EarningsAnnouncement>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/earnings", params)
.await
}
pub async fn firm_details(params: &[(&str, &str)]) -> Result<PaginatedResponse<FirmDetail>> {
let client = build_client()?;
client
.get("/v2/reference/news/benzinga/firm-details", params)
.await
}