use serde::Deserialize;
use thiserror::Error;
pub const MAX_LENGTH: usize = 20480;
#[derive(Error, Debug)]
pub enum AnalyzeCommentError {
#[error("HTTP error")]
RequestError(#[from] reqwest::Error),
#[error("The model appears to have changed")]
DeserializationError(#[from] serde_json::Error),
#[error("The comment was too long. It exceeded 20KB or {MAX_LENGTH} characters.")]
TextTooLong,
#[error("The comment to analyze was empty")]
TextEmpty,
#[error("{message}")]
LanguageUnsupportedByAttribute { message: String },
#[error("The API key is invalid")]
ApiKeyInvalid,
#[error("No API key was used")]
NoApiKey,
#[error("The request failed in some as-yet unhandled way")]
Unknown(AnalyzeCommentErrorResponse),
}
impl PartialEq for AnalyzeCommentError {
fn eq(&self, other: &Self) -> bool {
self.to_string() == other.to_string()
}
}
impl From<AnalyzeCommentErrorResponse> for AnalyzeCommentError {
fn from(value: AnalyzeCommentErrorResponse) -> Self {
let message: Option<&str> = (|| value.as_ref().error.as_ref()?.message.as_ref())().map(|x| x.as_str());
let code: Option<u16> = (|| value.as_ref().error.as_ref()?.code)().or(None);
let error_type: Option<&str> = (|| value.as_ref().error.as_ref()?.details.as_ref()?.first()?.error_type.as_ref())().map(|x| x.as_str());
let reason: Option<&str> = (|| value.as_ref().error.as_ref()?.details.as_ref()?.first()?.reason.as_ref())().map(|x| x.as_str());
if code == Some(403) {
AnalyzeCommentError::NoApiKey
} else if let Some(message) = message {
if message.contains("too many bytes") {
AnalyzeCommentError::TextTooLong
} else if reason == Some("API_KEY_INVALID") {
AnalyzeCommentError::ApiKeyInvalid
} else if error_type == Some("COMMENT_EMPTY") {
AnalyzeCommentError::TextEmpty
} else if error_type == Some("LANGUAGE_NOT_SUPPORTED_BY_ATTRIBUTE") {
AnalyzeCommentError::LanguageUnsupportedByAttribute { message: message.to_owned() }
} else {
AnalyzeCommentError::Unknown(value)
}
} else {
AnalyzeCommentError::Unknown(value)
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct AnalyzeCommentErrorResponse {
error: Option<Error>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Error {
code: Option<u16>,
message: Option<String>,
details: Option<Vec<Detail>>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Detail {
reason: Option<String>,
error_type: Option<String>,
}
impl AsRef<AnalyzeCommentErrorResponse> for AnalyzeCommentErrorResponse {
fn as_ref(&self) -> &AnalyzeCommentErrorResponse {
self
}
}