Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
93.33% covered (success)
93.33%
28 / 30
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
CreatesFromMeta
93.33% covered (success)
93.33%
28 / 30
66.67% covered (warning)
66.67%
2 / 3
19.11
0.00% covered (danger)
0.00%
0 / 1
 createFromMetadata
85.71% covered (warning)
85.71%
12 / 14
0.00% covered (danger)
0.00%
0 / 1
7.14
 createFromScalar
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
10
 createFromField
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2namespace Apie\Graphql\Concerns;
3
4use Apie\Core\Enums\ScalarType;
5use Apie\Core\Metadata\Fields\FieldInterface;
6use Apie\Core\Metadata\ItemListMetadata;
7use Apie\Core\Metadata\MetadataInterface;
8use Apie\Core\Metadata\NullableMetadataInterface;
9use Apie\Graphql\Types;
10use GraphQL\Type\Definition\Type;
11
12trait CreatesFromMeta
13{
14    public static function createFromMetadata(MetadataInterface $metadata, bool $nullable = false): Type
15    {
16        if ($metadata instanceof ItemListMetadata) {
17            $result = Type::listOf(self::createFromMetadata($metadata->getArrayItemType()));
18            if ($nullable) {
19                return $result;
20            }
21            return Type::nonNull($result);
22        }
23        if ($metadata instanceof NullableMetadataInterface) {
24            $nullable = $nullable || $metadata->allowsNull();
25        }
26        $scalarType = $metadata->toScalarType($nullable);
27        if ($scalarType === ScalarType::STDCLASS) {
28            $result = new self($metadata);
29            if ($nullable) {
30                return $result;
31            }
32            return Type::nonNull($result);
33        }
34        return self::createFromScalar($scalarType, $nullable);
35    }
36
37    public static function createFromScalar(ScalarType $scalarType, bool $nullable = false): Type
38    {
39        $result = match($scalarType) {
40            ScalarType::STRING => Type::string(),
41            ScalarType::INTEGER => Type::int(),
42            ScalarType::FLOAT => Type::float(),
43            ScalarType::BOOLEAN => Type::boolean(),
44            ScalarType::NULLVALUE => Types::null(),
45            ScalarType::ARRAY => Type::listOf(Types::json()),
46            ScalarType::STDCLASS => Types::json(),
47            ScalarType::MIXED => Types::json(),
48        };
49        if ($nullable) {
50            return $result;
51        }
52        return Type::nonNull($result);
53    }
54
55    public static function createFromField(FieldInterface $fieldMetadata): Type
56    {
57        $scalar = ScalarType::createFromReflectionType($fieldMetadata->getTypehint(), true);
58        $nullable = $fieldMetadata->allowsNull() || !$fieldMetadata->isRequired();
59        return self::createFromScalar($scalar, $nullable);
60    }
61}