Skip to main content

exa_async/types/
contents.rs

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