Security update for Core, with self-updated composer
[yaffs-website] / vendor / psy / psysh / src / Psy / TabCompletion / Matcher / MongoClientMatcher.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 Client tab completion Matcher.
16  *
17  * This matcher provides completion for MongoClient database names.
18  *
19  * @author Marc Garcia <markcial@gmail.com>
20  */
21 class MongoClientMatcher 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 \MongoClient) {
40             return array();
41         }
42
43         $list = $object->listDBs();
44
45         return array_filter(
46             array_map(function ($info) {
47                 return $info['name'];
48             }, $list['databases']),
49             function ($var) use ($input) {
50                 return AbstractMatcher::startsWith($input, $var);
51             }
52         );
53     }
54
55     /**
56      * {@inheritdoc}
57      */
58     public function hasMatched(array $tokens)
59     {
60         $token     = array_pop($tokens);
61         $prevToken = array_pop($tokens);
62
63         switch (true) {
64             case self::tokenIs($token, self::T_OBJECT_OPERATOR):
65             case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR):
66                 return true;
67         }
68
69         return false;
70     }
71 }