31aef898d1b2432cd0904adfbf156d53ac82cf58
[yaffs-website] / vendor / psy / psysh / src / Psy / TabCompletion / Matcher / MongoDatabaseMatcher.php
1 <?php
2
3 /*
4  * This file is part of Psy Shell.
5  *
6  * (c) 2012-2017 Justin Hileman
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 Psy\TabCompletion\Matcher;
13
14 /**
15  * A MongoDB tab completion Matcher.
16  *
17  * This matcher provides completion for Mongo collection names.
18  *
19  * @author Marc Garcia <markcial@gmail.com>
20  */
21 class MongoDatabaseMatcher extends AbstractContextAwareMatcher
22 {
23     /**
24      * {@inheritdoc}
25      */
26     public function getMatches(array $tokens, array $info = array())
27     {
28         $input = $this->getInput($tokens);
29
30         $firstToken = array_pop($tokens);
31         if (self::tokenIs($firstToken, self::T_STRING)) {
32             // second token is the object operator
33             array_pop($tokens);
34         }
35         $objectToken = array_pop($tokens);
36         $objectName = str_replace('$', '', $objectToken[1]);
37         $object = $this->getVariable($objectName);
38
39         if (!$object instanceof \MongoDB) {
40             return array();
41         }
42
43         return array_filter(
44             $object->getCollectionNames(),
45             function ($var) use ($input) {
46                 return AbstractMatcher::startsWith($input, $var);
47             }
48         );
49     }
50
51     /**
52      * {@inheritdoc}
53      */
54     public function hasMatched(array $tokens)
55     {
56         $token = array_pop($tokens);
57         $prevToken = array_pop($tokens);
58
59         switch (true) {
60             case self::tokenIs($token, self::T_OBJECT_OPERATOR):
61             case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR):
62                 return true;
63         }
64
65         return false;
66     }
67 }