use crate::messages::chunk_stream::ChunkStream;
use crate::messages::{
MessageChunk, MessagesError, MessagesRequestBody, MessagesResponseBody,
StreamError, StreamOption,
};
use crate::ApiError;
use crate::Client;
use crate::ClientError;
use futures_core::Stream;
pub(crate) async fn create_a_message(
client: &Client,
request_body: MessagesRequestBody,
) -> Result<MessagesResponseBody, MessagesError> {
if let Some(stream) = &request_body.stream {
if *stream != StreamOption::ReturnOnce {
return Err(MessagesError::StreamOptionMismatch);
}
}
let response = client
.post("https://api.anthropic.com/v1/messages")
.json(&request_body)
.send()
.await
.map_err(ClientError::HttpRequestError)?;
let status_code = response.status();
let response_text = response
.text()
.await
.map_err(ClientError::ReadResponseTextFailed)?;
if status_code.is_success() {
serde_json::from_str(&response_text).map_err(|error| {
{
ClientError::ResponseDeserializationFailed {
error,
text: response_text,
}
}
.into()
})
}
else {
let error_response =
serde_json::from_str(&response_text).map_err(|error| {
ClientError::ErrorResponseDeserializationFailed {
error,
text: response_text,
}
})?;
Err(ApiError::new(status_code, error_response).into())
}
}
pub(crate) async fn create_a_message_stream(
client: &Client,
request_body: MessagesRequestBody,
) -> Result<impl Stream<Item = Result<MessageChunk, StreamError>>, MessagesError>
{
if let None = &request_body.stream {
return Err(MessagesError::StreamOptionMismatch);
}
if let Some(stream) = &request_body.stream {
if *stream != StreamOption::ReturnStream {
return Err(MessagesError::StreamOptionMismatch);
}
}
let response = client
.post("https://api.anthropic.com/v1/messages")
.json(&request_body)
.send()
.await
.map_err(ClientError::HttpRequestError)?;
let status_code = response.status();
if status_code.is_success() {
let byte_stream = response.bytes_stream();
let chunk_stream = ChunkStream::new(byte_stream);
Ok(chunk_stream)
}
else {
let response_text = response
.text()
.await
.map_err(ClientError::ReadResponseTextFailed)?;
let error_response =
serde_json::from_str(&response_text).map_err(|error| {
ClientError::ErrorResponseDeserializationFailed {
error,
text: response_text,
}
})?;
Err(ApiError::new(status_code, error_response).into())
}
}