pub mod anthropic;
pub mod chatgpt;
pub mod common;
pub mod deepseek;
pub mod gemini;
pub mod m365copilot;
pub mod perplexity;
pub use anthropic::AnthropicProvider;
pub use chatgpt::ChatGPTProvider;
pub use common::{CloudConversation, CloudMessage, CloudProvider, FetchOptions};
pub use deepseek::DeepSeekProvider;
pub use gemini::GeminiProvider;
pub use m365copilot::M365CopilotProvider;
pub use perplexity::PerplexityProvider;
use super::config::ProviderType;
use crate::models::ChatSession;
use anyhow::Result;
pub fn get_cloud_provider(
provider_type: ProviderType,
api_key: Option<String>,
) -> Option<Box<dyn CloudProvider>> {
match provider_type {
ProviderType::M365Copilot => Some(Box::new(M365CopilotProvider::new(api_key))),
ProviderType::ChatGPT => Some(Box::new(ChatGPTProvider::new(api_key))),
ProviderType::Anthropic => Some(Box::new(AnthropicProvider::new(api_key))),
ProviderType::Perplexity => Some(Box::new(PerplexityProvider::new(api_key))),
ProviderType::DeepSeek => Some(Box::new(DeepSeekProvider::new(api_key))),
ProviderType::Gemini => Some(Box::new(GeminiProvider::new(api_key))),
_ => None,
}
}
pub fn fetch_conversations(
provider_type: ProviderType,
api_key: Option<String>,
options: &FetchOptions,
) -> Result<Vec<ChatSession>> {
let provider = get_cloud_provider(provider_type, api_key)
.ok_or_else(|| anyhow::anyhow!("Unsupported cloud provider: {}", provider_type))?;
provider.fetch_all_conversations(options)
}