Provider). */ final class Registry { /** * Available providers, keyed by ID. * * @return array */ public static function all(): array { $providers = array(); if ( self::mock_allowed( wp_get_environment_type(), defined( 'FITZARO_ENABLE_MOCK' ) && (bool) constant( 'FITZARO_ENABLE_MOCK' ) ) ) { $providers['mock'] = new MockProvider(); } if ( '' !== OpenAi\OpenAiKey::get() ) { $providers[ OpenAi\OpenAiProvider::ID ] = self::openai(); } /** * Filters the available try-on providers. * * @since 1.0.0 * * @param array $providers Providers keyed by ID. */ return self::only_valid( apply_filters( 'fitzaro/providers', $providers ) ); } /** * Keeps entries that are real providers registered under their own ID. * * The hook documents an array of providers, but any plugin can return anything from a filter, * so the result is checked at runtime rather than trusted. * * @param mixed $candidates Filter result. * @return array */ public static function only_valid( $candidates ): array { $valid = array(); foreach ( is_array( $candidates ) ? $candidates : array() as $id => $provider ) { if ( is_string( $id ) && $provider instanceof Provider && $provider->id() === $id ) { $valid[ $id ] = $provider; } } return $valid; } /** * A provider by ID, or null. * * @param string $id Provider ID. */ public static function get( string $id ): ?Provider { return self::all()[ $id ] ?? null; } /** * Whether the mock may be offered: only on local/development sites, or when the site owner * explicitly sets FITZARO_ENABLE_MOCK (for demos). * * @param string $environment_type wp_get_environment_type(). * @param bool $forced FITZARO_ENABLE_MOCK. */ public static function mock_allowed( string $environment_type, bool $forced ): bool { return $forced || in_array( $environment_type, array( 'local', 'development' ), true ); } /** * The OpenAI provider with the site's key and model, whether or not a key is set. */ public static function openai(): OpenAi\OpenAiProvider { return new OpenAi\OpenAiProvider( array( OpenAi\OpenAiKey::class, 'get' ), \Fitzaro\Settings::openai_model(), new OpenAi\WpHttp() ); } }