Skip to main content

exa_async/types/
contents.rs

1//! Types for the Exa `/contents` endpoint
2
3use serde::Deserialize;
4use serde::Serialize;
5
6use super::common::ContentsOptions;
7use super::common::LivecrawlOption;
8use super::common::SearchResult;
9
10/// Request body for `POST /contents`
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "camelCase")]
13pub struct ContentsRequest {
14    /// URLs to retrieve content for
15    pub urls: Vec<String>,
16
17    /// What content to include
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub contents: Option<ContentsOptions>,
20
21    /// Livecrawl option
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub livecrawl: Option<LivecrawlOption>,
24
25    /// Filter out results with empty content
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub filter_empty_results: Option<bool>,
28}
29
30impl ContentsRequest {
31    /// Create a new contents request for the given URLs
32    #[must_use]
33    pub const fn new(urls: Vec<String>) -> Self {
34        Self {
35            urls,
36            contents: None,
37            livecrawl: None,
38            filter_empty_results: None,
39        }
40    }
41}
42
43/// Response from `POST /contents`
44#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(rename_all = "camelCase")]
46pub struct ContentsResponse {
47    /// Content results
48    pub results: Vec<SearchResult>,
49
50    /// Cost in dollars
51    #[serde(default)]
52    pub cost_dollars: Option<super::search::CostDollars>,
53}