Subversion-Projekte lars-tiefland.laravel_shop

Revision

Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
/*
4
 * This file is part of Psy Shell.
5
 *
6
 * (c) 2012-2022 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 [];
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): bool
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
}