CommandInfoDeserializer.php 2.88 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
<?php
namespace Consolidation\AnnotatedCommand\Parser;

use Symfony\Component\Console\Input\InputOption;
use Consolidation\AnnotatedCommand\Parser\Internal\CommandDocBlockParser;
use Consolidation\AnnotatedCommand\Parser\Internal\CommandDocBlockParserFactory;
use Consolidation\AnnotatedCommand\AnnotationData;

/**
 * Deserialize a CommandInfo object
 */
class CommandInfoDeserializer
{
    // TODO: in a future version, move CommandInfo::deserialize here
    public function deserialize($data)
    {
        return CommandInfo::deserialize((array)$data);
    }

    protected static function cachedMethodExists($cache)
    {
        return method_exists($cache['class'], $cache['method_name']);
    }

    public static function isValidSerializedData($cache)
    {
        return
            isset($cache['schema']) &&
            isset($cache['method_name']) &&
            isset($cache['mtime']) &&
            ($cache['schema'] > 0) &&
            ($cache['schema'] == CommandInfo::SERIALIZATION_SCHEMA_VERSION) &&
            self::cachedMethodExists($cache);
    }

    public function constructFromCache(CommandInfo $commandInfo, $info_array)
    {
        $info_array += $this->defaultSerializationData();

        $commandInfo
            ->setName($info_array['name'])
            ->replaceRawAnnotations($info_array['annotations'])
            ->setAliases($info_array['aliases'])
            ->setHelp($info_array['help'])
            ->setDescription($info_array['description'])
            ->replaceExampleUsages($info_array['example_usages'])
            ->setReturnType($info_array['return_type'])
            ->setInjectedClasses($info_array['injected_classes'])
            ;

        $this->constructDefaultsWithDescriptions($commandInfo->arguments(), (array)$info_array['arguments']);
        $this->constructDefaultsWithDescriptions($commandInfo->options(), (array)$info_array['options']);
    }

    protected function constructDefaultsWithDescriptions(DefaultsWithDescriptions $defaults, $data)
    {
        foreach ($data as $key => $info) {
            $info = (array)$info;
            $defaults->add($key, $info['description']);
            if (array_key_exists('default', $info)) {
                $defaults->setDefaultValue($key, $info['default']);
            }
        }
    }


    /**
     * Default data. Everything should be provided during serialization;
     * this is just as a fallback for unusual circumstances.
     * @return array
     */
    protected function defaultSerializationData()
    {
        return [
            'name' => '',
            'description' => '',
            'help' => '',
            'aliases' => [],
            'annotations' => [],
            'example_usages' => [],
            'return_type' => [],
            'parameters' => [],
            'arguments' => [],
            'options' => [],
            'injected_classes' => [],
            'mtime' => 0,
        ];
    }
}