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
|
<?php
namespace Pheanstalk;
/**
* A response parser for commands that return a subset of YAML.
* Expected response is 'OK', 'NOT_FOUND' response is also handled.
* Parser expects either a YAML list or dictionary, depending on mode.
*
* @author Paul Annesley
* @package Pheanstalk
* @license http://www.opensource.org/licenses/mit-license.php
*/
class YamlResponseParser
implements \Pheanstalk\ResponseParser
{
const MODE_LIST = 'list';
const MODE_DICT = 'dict';
private $_mode;
/**
* @param string $mode self::MODE_*
*/
public function __construct($mode)
{
$this->_mode = $mode;
}
/* (non-phpdoc)
* @see ResponseParser::parseResponse()
*/
public function parseResponse($responseLine, $responseData)
{
if ($responseLine == Response::RESPONSE_NOT_FOUND) {
throw new Exception\ServerException(sprintf(
'Server reported %s',
$responseLine
));
}
if (!preg_match('#^OK \d+$#', $responseLine)) {
throw new Exception\ServerException(sprintf(
'Unhandled response: %s',
$responseLine
));
}
$dataLines = preg_split("#[\r\n]+#", rtrim($responseData));
if (isset($dataLines[0]) && $dataLines[0] == '---') {
array_shift($dataLines); // discard header line
}
$data = array_map(array($this, '_mapYamlList'), $dataLines);
if ($this->_mode == self::MODE_DICT) {
// TODO: do this better.
$array = array();
foreach ($data as $line) {
if (!preg_match('#(\S+):\s*(.*)#', $line, $matches)) {
throw new Exception("YAML parse error for line: $line");
}
list(, $key, $value) = $matches;
$array[$key] = $value;
}
$data = $array;
}
return new Response\ArrayResponse('OK', $data);
}
/**
* Callback for array_map to process YAML lines.
* @param string $line
* @return string
*/
private function _mapYamlList($line)
{
return ltrim($line, '- ');
}
}
|