comfyui_api/api/
history.rs1use reqwest::Url;
2
3use crate::models::{History, Task};
4
5#[derive(thiserror::Error, Debug)]
7#[non_exhaustive]
8pub enum HistoryApiError {
9 #[error("Failed to parse endpoint URL")]
11 ParseError(#[from] url::ParseError),
12 #[error("Failed to send request")]
14 RequestFailed(#[from] reqwest::Error),
15 #[error("Parsing response failed")]
17 InvalidResponse(#[source] reqwest::Error),
18 #[error("Failed to get response data")]
20 GetDataFailed(#[source] reqwest::Error),
21 #[error("Failed to get history: {status}: {error}")]
23 GetHistoryFailed {
24 status: reqwest::StatusCode,
25 error: String,
26 },
27 #[error("Task not found: {0}")]
29 TaskNotFound(uuid::Uuid),
30 #[error("Failed to get task {task}: {status}: {error}")]
32 GetTaskFailed {
33 task: uuid::Uuid,
34 status: reqwest::StatusCode,
35 error: String,
36 },
37}
38
39type Result<T> = std::result::Result<T, HistoryApiError>;
40
41#[derive(Clone, Debug)]
43pub struct HistoryApi {
44 client: reqwest::Client,
45 endpoint: Url,
46}
47
48impl HistoryApi {
49 pub fn new<S>(client: reqwest::Client, endpoint: S) -> Result<Self>
61 where
62 S: AsRef<str>,
63 {
64 Ok(Self::new_with_url(client, Url::parse(endpoint.as_ref())?))
65 }
66
67 pub fn new_with_url(client: reqwest::Client, endpoint: Url) -> Self {
78 Self { client, endpoint }
79 }
80
81 pub async fn get(&self) -> Result<History> {
87 let response = self.client.get(self.endpoint.clone()).send().await?;
88 if response.status().is_success() {
89 return response
90 .json()
91 .await
92 .map_err(HistoryApiError::InvalidResponse);
93 }
94 let status = response.status();
95 let text = response
96 .text()
97 .await
98 .map_err(HistoryApiError::GetDataFailed)?;
99 Err(HistoryApiError::GetHistoryFailed {
100 status,
101 error: text,
102 })
103 }
104
105 pub async fn get_prompt(&self, prompt_id: &uuid::Uuid) -> Result<Task> {
115 let response = self
116 .client
117 .get(self.endpoint.clone().join(prompt_id.to_string().as_str())?)
118 .send()
119 .await?;
120 if response.status().is_success() {
121 let mut history: History = response
122 .json()
123 .await
124 .map_err(HistoryApiError::InvalidResponse)?;
125 return history
126 .tasks
127 .remove(prompt_id)
128 .ok_or_else(|| HistoryApiError::TaskNotFound(*prompt_id));
129 }
130 let status = response.status();
131 let text = response
132 .text()
133 .await
134 .map_err(HistoryApiError::GetDataFailed)?;
135 Err(HistoryApiError::GetTaskFailed {
136 task: *prompt_id,
137 status,
138 error: text,
139 })
140 }
141}