use sqlx::PgPool;
pub struct ErrorHandlingRepo<'a> {
pub pool: &'a PgPool,
}
impl<'a> ErrorHandlingRepo<'a> {
pub async fn pick_chat_stream_fallback_phrase(&self) -> Result<Option<String>, sqlx::Error> {
let payload: Option<serde_json::Value> = sqlx::query_scalar(
"SELECT payload FROM engine.error_handling_config \
WHERE kind = 'chat_stream_failure_fallback_phrases'",
)
.fetch_optional(self.pool)
.await?;
let Some(serde_json::Value::Array(arr)) = payload else {
return Ok(None);
};
if arr.is_empty() {
return Ok(None);
}
use rand::seq::SliceRandom as _;
let mut rng = rand::thread_rng();
Ok(arr
.choose(&mut rng)
.and_then(|v| v.as_str().map(str::to_string)))
}
}