<?php
namespace Robo\Collection;

use Consolidation\AnnotatedCommand\Hooks\ProcessResultInterface;
use Consolidation\AnnotatedCommand\CommandData;
use Robo\Contract\TaskInterface;
use Robo\Result;

/**
 * The collection process hook is added to the annotation command
 * hook manager in Runner::configureContainer(). This hook will be
 * called every time a command runs.  If the command result is a
 * \Robo\Contract\TaskInterface (in particular, \Robo\Collection\Collection),
 * then we run the collection, and return the result.  We ignore results
 * of any other type.
 */
class CollectionProcessHook implements ProcessResultInterface
{
    /**
     * @param \Robo\Result|\Robo\Contract\TaskInterface $result
     * @param \Consolidation\AnnotatedCommand\CommandData $commandData
     *
     * @return null|\Robo\Result
     */
    public function process($result, CommandData $commandData)
    {
        if ($result instanceof TaskInterface) {
            try {
                return $result->run();
            } catch (\Exception $e) {
                return Result::fromException($result, $e);
            }
        }
    }
}
