rssume 0.2.5

RSS middleware with AI-powered translation and summarization
use super::api::AppState;
use axum::{Extension, Router, routing::get};
use std::sync::Arc;

pub fn router(state: Arc<AppState>) -> Router {
    Router::new()
        .route("/feeds/{name}", get(serve_feed))
        .layer(Extension(state))
}

async fn serve_feed(
    axum::extract::Path(name): axum::extract::Path<String>,
    Extension(state): Extension<Arc<AppState>>,
) -> Result<(axum::http::StatusCode, [(String, String); 1], String), crate::error::AppError> {
    let config = state.config.read().await;
    let feed_cfg = config
        .feeds
        .iter()
        .find(|f| f.name == name)
        .ok_or_else(|| crate::error::AppError::NotFound(format!("Feed '{}' not found", name)))?;

    if !feed_cfg.enabled {
        return Err(crate::error::AppError::NotFound(format!(
            "Feed '{}' is disabled",
            name
        )));
    }

    let feed_data = crate::storage::FeedData::load(&name)?;
    let rss_xml = crate::rss::generate::generate_rss(&name, &feed_data.articles);

    Ok((
        axum::http::StatusCode::OK,
        [(
            "Content-Type".to_string(),
            "application/rss+xml; charset=utf-8".to_string(),
        )],
        rss_xml,
    ))
}