Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
36.36% covered (danger)
36.36%
4 / 11
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ArticleParserFactory
36.36% covered (danger)
36.36%
4 / 11
0.00% covered (danger)
0.00%
0 / 3
15.28
0.00% covered (danger)
0.00%
0 / 1
 getParser
80.00% covered (warning)
80.00%
4 / 5
0.00% covered (danger)
0.00%
0 / 1
3.07
 getSupportedSources
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 registerParser
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace App\Services\Factories;
4
5use App\Contracts\ArticleParserInterface;
6use App\Services\Parsers\VrtArticleParser;
7use App\Services\Parsers\BelgaArticleParser;
8use Exception;
9
10class ArticleParserFactory
11{
12    /**
13     * @var array<int, class-string<ArticleParserInterface>>
14     */
15    private static array $parsers = [
16        VrtArticleParser::class,
17        BelgaArticleParser::class,
18    ];
19
20    public static function getParser(string $url): ArticleParserInterface
21    {
22        foreach (self::$parsers as $parserClass) {
23            $parser = new $parserClass();
24            
25            if ($parser->canParse($url)) {
26                return $parser;
27            }
28        }
29
30        throw new Exception("No parser found for URL: {$url}");
31    }
32
33    /**
34     * @return array<int, string>
35     */
36    public static function getSupportedSources(): array
37    {
38        return array_map(function($parserClass) {
39            $parser = new $parserClass();
40            return $parser->getSourceName();
41        }, self::$parsers);
42    }
43
44    /**
45     * @param class-string<ArticleParserInterface> $parserClass
46     */
47    public static function registerParser(string $parserClass): void
48    {
49        if (!in_array($parserClass, self::$parsers)) {
50            self::$parsers[] = $parserClass;
51        }
52    }
53}