use crate::{ChurchApiClient, ClientSermon, Sermon}; use std::sync::Arc; // Shared helper function to convert Sermon objects to JSON with proper formatting fn sermons_to_json(sermons: Vec, content_type: &str, base_url: &str) -> String { let client_sermons: Vec = sermons .iter() .map(|sermon| ClientSermon::from_sermon_with_base_url(sermon.clone(), base_url)) .collect(); serde_json::to_string(&client_sermons).unwrap_or_else(|_| "[]".to_string()) } pub fn fetch_sermons_json() -> String { let client = super::get_or_create_client(); let rt = super::get_runtime(); match rt.block_on(async { client.get_sermons(None).await }) { Ok(response) => sermons_to_json(response.data.items, "videos", "https://church.adventist.app"), Err(_) => "[]".to_string(), } } pub fn parse_sermons_from_json(sermons_json: String) -> String { match serde_json::from_str::>(&sermons_json) { Ok(sermons) => sermons_to_json(sermons, "videos", "https://church.adventist.app"), Err(_) => "[]".to_string(), } } pub fn filter_sermons_by_media_type(sermons_json: String, media_type_str: String) -> String { match serde_json::from_str::>(&sermons_json) { Ok(sermons) => { let filtered_sermons: Vec = sermons.into_iter() .filter(|sermon| { match media_type_str.to_lowercase().as_str() { "video" => sermon.video_url.is_some(), "audio" => sermon.audio_url.is_some(), "both" => sermon.video_url.is_some() && sermon.audio_url.is_some(), _ => true, // Return all sermons for unknown types } }) .collect(); sermons_to_json(filtered_sermons, "videos", "https://church.adventist.app") }, Err(_) => "[]".to_string(), } }