This repository has been archived by the owner on May 12, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ROSRA.php
118 lines (115 loc) · 2.82 KB
/
ROSRA.php
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
/**
* Created by PhpStorm.
* User: kousakananako
* Date: 2019/05/30
* Time: 2:07
*/
namespace arily\accounting\plugin\AddressList;
class ROSRA implements \Iterator, \ArrayAccess, \Countable {
public $parsed = [];
public $raw = [];
public $current;
public function __construct($raw) {
$this->current = 0;
$position = array_keys($raw,'!re');
if (isset($position[1])){
$length = $position[1] - $position[0];
$raw = array_chunk($raw, $length);
array_pop($raw);
} else {
$raw = [$raw];
}
$this->raw = $raw;
}
public function next(){
++$this->current;
}
public function current() {
if (isset($this->parsed[$this->current])){
return $this->parsed[$this->current];
} elseif (isset($this->raw[$this->current])){
return $this->parseResponse($this->raw[$this->current])[0];
} else {
return FALSE;
}
}
public function key() {
return $this->current;
}
public function valid() {
return isset($this->raw[$this->current]);
}
public function count() {
return count($this->raw);
}
public function rewind() {
$this->current = 0;
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->parsed[] = $value;
throw new \Exception('don\'t append to me It will be overwrite sometime then cause a Bug I PROMISE');
} else {
$this->parsed[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->raw[$offset]);
}
public function offsetUnset($offset) {
unset($this->parsed[$offset]);
unset($this->raw[$offset]);
}
public function offsetGet($offset) {
if (isset($this->parsed[$offset])){
return $this->parsed[$offset];
} elseif(isset($this->raw[$offset])) {
return $this->parsed[$offset] = $this->parseResponse($this->raw[$offset])[0];
}
}
public function flush(){
$this->raw = [];
$this->parsed = [];
}
private function parseResponse(array $response): array
{
$result = [];
$i = -1;
$lines = \count($response);
foreach ($response as $key => $value) {
switch ($value) {
case '!re':
$i++;
break;
case '!fatal':
$result = $response;
break 2;
case '!trap':
case '!done':
// Check for =ret=, .tag and any other following messages
for ($j = $key + 1; $j <= $lines; $j++) {
// If we have lines after current one
if (isset($response[$j])) {
$this->pregResponse($response[$j], $matches);
if (isset($matches[1][0], $matches[2][0])) {
$result['after'][$matches[1][0]] = $matches[2][0];
}
}
}
break 2;
default:
$this->pregResponse($value, $matches);
if (isset($matches[1][0], $matches[2][0])) {
$result[$i][$matches[1][0]] = $matches[2][0];
}
break;
}
}
return $result;
}
private function pregResponse(string $value, &$matches)
{
preg_match_all('/^[=|\.](.*)=(.*)/', $value, $matches);
}
}