Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / vendor / symfony / serializer / Mapping / Loader / YamlFileLoader.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\Serializer\Mapping\Loader;
13
14 use Symfony\Component\Serializer\Exception\MappingException;
15 use Symfony\Component\Serializer\Mapping\AttributeMetadata;
16 use Symfony\Component\Serializer\Mapping\ClassMetadataInterface;
17 use Symfony\Component\Yaml\Parser;
18
19 /**
20  * YAML File Loader.
21  *
22  * @author Kévin Dunglas <dunglas@gmail.com>
23  */
24 class YamlFileLoader extends FileLoader
25 {
26     private $yamlParser;
27
28     /**
29      * An array of YAML class descriptions.
30      *
31      * @var array
32      */
33     private $classes;
34
35     /**
36      * {@inheritdoc}
37      */
38     public function loadClassMetadata(ClassMetadataInterface $classMetadata)
39     {
40         if (null === $this->classes) {
41             $this->classes = $this->getClassesFromYaml();
42         }
43
44         if (!$this->classes) {
45             return false;
46         }
47
48         if (!isset($this->classes[$classMetadata->getName()])) {
49             return false;
50         }
51
52         $yaml = $this->classes[$classMetadata->getName()];
53
54         if (isset($yaml['attributes']) && \is_array($yaml['attributes'])) {
55             $attributesMetadata = $classMetadata->getAttributesMetadata();
56
57             foreach ($yaml['attributes'] as $attribute => $data) {
58                 if (isset($attributesMetadata[$attribute])) {
59                     $attributeMetadata = $attributesMetadata[$attribute];
60                 } else {
61                     $attributeMetadata = new AttributeMetadata($attribute);
62                     $classMetadata->addAttributeMetadata($attributeMetadata);
63                 }
64
65                 if (isset($data['groups'])) {
66                     if (!\is_array($data['groups'])) {
67                         throw new MappingException(sprintf('The "groups" key must be an array of strings in "%s" for the attribute "%s" of the class "%s".', $this->file, $attribute, $classMetadata->getName()));
68                     }
69
70                     foreach ($data['groups'] as $group) {
71                         if (!\is_string($group)) {
72                             throw new MappingException(sprintf('Group names must be strings in "%s" for the attribute "%s" of the class "%s".', $this->file, $attribute, $classMetadata->getName()));
73                         }
74
75                         $attributeMetadata->addGroup($group);
76                     }
77                 }
78
79                 if (isset($data['max_depth'])) {
80                     if (!\is_int($data['max_depth'])) {
81                         throw new MappingException(sprintf('The "max_depth" value must be an integer in "%s" for the attribute "%s" of the class "%s".', $this->file, $attribute, $classMetadata->getName()));
82                     }
83
84                     $attributeMetadata->setMaxDepth($data['max_depth']);
85                 }
86             }
87         }
88
89         return true;
90     }
91
92     /**
93      * Return the names of the classes mapped in this file.
94      *
95      * @return string[] The classes names
96      */
97     public function getMappedClasses()
98     {
99         if (null === $this->classes) {
100             $this->classes = $this->getClassesFromYaml();
101         }
102
103         return array_keys($this->classes);
104     }
105
106     private function getClassesFromYaml()
107     {
108         if (!stream_is_local($this->file)) {
109             throw new MappingException(sprintf('This is not a local file "%s".', $this->file));
110         }
111
112         if (null === $this->yamlParser) {
113             $this->yamlParser = new Parser();
114         }
115
116         $classes = $this->yamlParser->parseFile($this->file);
117
118         if (empty($classes)) {
119             return array();
120         }
121
122         if (!\is_array($classes)) {
123             throw new MappingException(sprintf('The file "%s" must contain a YAML array.', $this->file));
124         }
125
126         return $classes;
127     }
128 }