Chris@0
|
1 <?php
|
Chris@0
|
2 namespace Consolidation\AnnotatedCommand\Parser;
|
Chris@0
|
3
|
Chris@0
|
4 use Symfony\Component\Console\Input\InputOption;
|
Chris@0
|
5 use Consolidation\AnnotatedCommand\Parser\Internal\CommandDocBlockParser;
|
Chris@0
|
6 use Consolidation\AnnotatedCommand\Parser\Internal\CommandDocBlockParserFactory;
|
Chris@0
|
7 use Consolidation\AnnotatedCommand\AnnotationData;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * Deserialize a CommandInfo object
|
Chris@0
|
11 */
|
Chris@0
|
12 class CommandInfoDeserializer
|
Chris@0
|
13 {
|
Chris@0
|
14 // TODO: in a future version, move CommandInfo::deserialize here
|
Chris@0
|
15 public function deserialize($data)
|
Chris@0
|
16 {
|
Chris@0
|
17 return CommandInfo::deserialize((array)$data);
|
Chris@0
|
18 }
|
Chris@0
|
19
|
Chris@0
|
20 protected static function cachedMethodExists($cache)
|
Chris@0
|
21 {
|
Chris@0
|
22 return method_exists($cache['class'], $cache['method_name']);
|
Chris@0
|
23 }
|
Chris@0
|
24
|
Chris@0
|
25 public static function isValidSerializedData($cache)
|
Chris@0
|
26 {
|
Chris@0
|
27 return
|
Chris@0
|
28 isset($cache['schema']) &&
|
Chris@0
|
29 isset($cache['method_name']) &&
|
Chris@0
|
30 isset($cache['mtime']) &&
|
Chris@0
|
31 ($cache['schema'] > 0) &&
|
Chris@17
|
32 ($cache['schema'] == CommandInfo::SERIALIZATION_SCHEMA_VERSION) &&
|
Chris@0
|
33 self::cachedMethodExists($cache);
|
Chris@0
|
34 }
|
Chris@0
|
35
|
Chris@0
|
36 public function constructFromCache(CommandInfo $commandInfo, $info_array)
|
Chris@0
|
37 {
|
Chris@0
|
38 $info_array += $this->defaultSerializationData();
|
Chris@0
|
39
|
Chris@0
|
40 $commandInfo
|
Chris@0
|
41 ->setName($info_array['name'])
|
Chris@0
|
42 ->replaceRawAnnotations($info_array['annotations'])
|
Chris@0
|
43 ->setAliases($info_array['aliases'])
|
Chris@0
|
44 ->setHelp($info_array['help'])
|
Chris@0
|
45 ->setDescription($info_array['description'])
|
Chris@0
|
46 ->replaceExampleUsages($info_array['example_usages'])
|
Chris@0
|
47 ->setReturnType($info_array['return_type'])
|
Chris@17
|
48 ->setInjectedClasses($info_array['injected_classes'])
|
Chris@0
|
49 ;
|
Chris@0
|
50
|
Chris@0
|
51 $this->constructDefaultsWithDescriptions($commandInfo->arguments(), (array)$info_array['arguments']);
|
Chris@0
|
52 $this->constructDefaultsWithDescriptions($commandInfo->options(), (array)$info_array['options']);
|
Chris@0
|
53 }
|
Chris@0
|
54
|
Chris@0
|
55 protected function constructDefaultsWithDescriptions(DefaultsWithDescriptions $defaults, $data)
|
Chris@0
|
56 {
|
Chris@0
|
57 foreach ($data as $key => $info) {
|
Chris@0
|
58 $info = (array)$info;
|
Chris@0
|
59 $defaults->add($key, $info['description']);
|
Chris@0
|
60 if (array_key_exists('default', $info)) {
|
Chris@0
|
61 $defaults->setDefaultValue($key, $info['default']);
|
Chris@0
|
62 }
|
Chris@0
|
63 }
|
Chris@0
|
64 }
|
Chris@0
|
65
|
Chris@0
|
66
|
Chris@0
|
67 /**
|
Chris@0
|
68 * Default data. Everything should be provided during serialization;
|
Chris@0
|
69 * this is just as a fallback for unusual circumstances.
|
Chris@0
|
70 * @return array
|
Chris@0
|
71 */
|
Chris@0
|
72 protected function defaultSerializationData()
|
Chris@0
|
73 {
|
Chris@0
|
74 return [
|
Chris@0
|
75 'name' => '',
|
Chris@0
|
76 'description' => '',
|
Chris@0
|
77 'help' => '',
|
Chris@0
|
78 'aliases' => [],
|
Chris@0
|
79 'annotations' => [],
|
Chris@0
|
80 'example_usages' => [],
|
Chris@0
|
81 'return_type' => [],
|
Chris@0
|
82 'parameters' => [],
|
Chris@0
|
83 'arguments' => [],
|
Chris@0
|
84 'options' => [],
|
Chris@17
|
85 'injected_classes' => [],
|
Chris@0
|
86 'mtime' => 0,
|
Chris@0
|
87 ];
|
Chris@0
|
88 }
|
Chris@0
|
89 }
|