Test Failed
Push — master ( 690100...f55788 )
by Kirill
09:19
created

Factory   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 43
rs 10
c 0
b 0
f 0
wmc 2
lcom 0
cbo 2

1 Method

Rating   Name   Duplication   Size   Complexity  
A resolve() 0 11 2
1
<?php
2
/**
3
 * This file is part of Railt package.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
declare(strict_types=1);
9
10
namespace Railt\SDL\Frontend\Builder;
11
12
use Railt\Io\Readable;
13
use Railt\Parser\Ast\RuleInterface;
14
use Railt\SDL\Exception\InternalException;
15
use Railt\SDL\Frontend\Builder\Definition\ArgumentBuilder;
16
use Railt\SDL\Frontend\Builder\Definition\DirectiveBuilder;
17
use Railt\SDL\Frontend\Builder\Definition\EnumBuilder;
18
use Railt\SDL\Frontend\Builder\Definition\EnumValueBuilder;
19
use Railt\SDL\Frontend\Builder\Definition\FieldBuilder;
20
use Railt\SDL\Frontend\Builder\Definition\InputBuilder;
21
use Railt\SDL\Frontend\Builder\Definition\InputFieldBuilder;
22
use Railt\SDL\Frontend\Builder\Definition\InterfaceBuilder;
23
use Railt\SDL\Frontend\Builder\Definition\ObjectBuilder;
24
use Railt\SDL\Frontend\Builder\Definition\ScalarBuilder;
25
use Railt\SDL\Frontend\Builder\Definition\SchemaBuilder;
26
use Railt\SDL\Frontend\Builder\Definition\SchemaFieldBuilder;
27
use Railt\SDL\Frontend\Builder\Definition\UnionBuilder;
28
29
/**
30
 * Class Factory
31
 */
32
class Factory
33
{
34
    /**
35
     * @var string[]
36
     */
37
    private const AST_MAPPINGS = [
38
        // Root
39
        'Document'              => DocumentBuilder::class,
40
        // Type definitions
41
        'DirectiveDefinition'   => DirectiveBuilder::class,
42
        'EnumDefinition'        => EnumBuilder::class,
43
        'InputDefinition'       => InputBuilder::class,
44
        'InterfaceDefinition'   => InterfaceBuilder::class,
45
        'ObjectDefinition'      => ObjectBuilder::class,
46
        'ScalarDefinition'      => ScalarBuilder::class,
47
        'SchemaDefinition'      => SchemaBuilder::class,
48
        'UnionDefinition'       => UnionBuilder::class,
49
        // Dependent definitions
50
        'EnumValueDefinition'   => EnumValueBuilder::class,
51
        'ArgumentDefinition'    => ArgumentBuilder::class,
52
        'FieldDefinition'       => FieldBuilder::class,
53
        'InputFieldDefinition'  => InputFieldBuilder::class,
54
        'SchemaFieldDefinition' => SchemaFieldBuilder::class,
55
    ];
56
57
    /**
58
     * @param Readable $file
59
     * @param RuleInterface $ast
60
     * @return BuilderInterface
61
     * @throws \Railt\Io\Exception\ExternalFileException
62
     */
63
    public function resolve(Readable $file, RuleInterface $ast): BuilderInterface
64
    {
65
        $builder = self::AST_MAPPINGS[$ast->getName()] ?? null;
66
67
        if ($builder === null) {
68
            $error = 'Unrecognized abstract syntax tree production node "%s"';
69
            throw (new InternalException(\sprintf($error, $ast->getName())))->throwsIn($file, $ast->getOffset());
70
        }
71
72
        return new $builder;
73
    }
74
}
75