Skip to main content

edgequake_llm/imagegen/
factory.rs

1//! Factory helpers for image generation providers.
2
3use std::sync::Arc;
4
5use crate::imagegen::error::{ImageGenError, Result};
6use crate::imagegen::providers::{
7    FalImageGen, GeminiImageGenProvider, MockImageGenProvider, VertexAIImageGen,
8};
9use crate::imagegen::traits::ImageGenProvider;
10
11/// Factory for constructing image generation providers.
12pub struct ImageGenFactory;
13
14impl ImageGenFactory {
15    /// Create the most appropriate provider from the current environment.
16    pub fn from_env() -> Result<Arc<dyn ImageGenProvider>> {
17        if std::env::var("GEMINI_API_KEY").is_ok() {
18            return Ok(Arc::new(GeminiImageGenProvider::from_env()?));
19        }
20
21        if std::env::var("GOOGLE_CLOUD_PROJECT").is_ok() {
22            return Ok(Arc::new(GeminiImageGenProvider::from_env_vertex_ai()?));
23        }
24
25        if std::env::var("FAL_KEY").is_ok() {
26            return Ok(Arc::new(FalImageGen::from_env()?));
27        }
28
29        Err(ImageGenError::ConfigError(
30            "no image generation credentials found; set GEMINI_API_KEY, GOOGLE_CLOUD_PROJECT, or FAL_KEY".to_string(),
31        ))
32    }
33
34    /// Create a Gemini image provider.
35    pub fn gemini_from_env() -> Result<GeminiImageGenProvider> {
36        GeminiImageGenProvider::from_env()
37    }
38
39    /// Create a Gemini image provider forced to Vertex AI backend.
40    pub fn gemini_vertex_from_env() -> Result<GeminiImageGenProvider> {
41        GeminiImageGenProvider::from_env_vertex_ai()
42    }
43
44    /// Create a Vertex Imagen provider.
45    pub fn vertex_imagen_from_env() -> Result<VertexAIImageGen> {
46        VertexAIImageGen::from_env()
47    }
48
49    /// Create a FAL provider.
50    pub fn fal_from_env() -> Result<FalImageGen> {
51        FalImageGen::from_env()
52    }
53
54    /// Create a mock provider.
55    pub fn mock() -> MockImageGenProvider {
56        MockImageGenProvider::default()
57    }
58}