Skip to content

Commit fb8f0c4

Browse files
committed
Add support for number tokens in ImapTokenizer
1 parent e84f2b8 commit fb8f0c4

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/Connection/ImapTokenizer.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use DirectoryTree\ImapEngine\Connection\Tokens\ListClose;
1010
use DirectoryTree\ImapEngine\Connection\Tokens\ListOpen;
1111
use DirectoryTree\ImapEngine\Connection\Tokens\Literal;
12+
use DirectoryTree\ImapEngine\Connection\Tokens\Number;
1213
use DirectoryTree\ImapEngine\Connection\Tokens\QuotedString;
1314
use DirectoryTree\ImapEngine\Connection\Tokens\ResponseCodeClose;
1415
use DirectoryTree\ImapEngine\Connection\Tokens\ResponseCodeOpen;
@@ -120,6 +121,11 @@ public function nextToken(): ?Token
120121
return $this->readLiteral();
121122
}
122123

124+
// Check for number.
125+
if (ctype_digit($char)) {
126+
return $this->readNumber();
127+
}
128+
123129
// Otherwise, parse an atom.
124130
return $this->readAtom();
125131
}
@@ -300,6 +306,36 @@ protected function readLiteral(): Literal
300306
return new Literal($literal);
301307
}
302308

309+
/**
310+
* Reads a number token.
311+
*
312+
* Numbers are sequences of digits.
313+
*/
314+
protected function readNumber(): Number
315+
{
316+
$value = '';
317+
318+
while (true) {
319+
$this->ensureBuffer(1);
320+
321+
$char = $this->currentChar();
322+
323+
if ($char === null) {
324+
break;
325+
}
326+
327+
if (! ctype_digit($char)) {
328+
break;
329+
}
330+
331+
$value .= $char;
332+
333+
$this->advance();
334+
}
335+
336+
return new Number($value);
337+
}
338+
303339
/**
304340
* Reads an atom token.
305341
*

src/Connection/Tokens/Number.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?php
2+
3+
namespace DirectoryTree\ImapEngine\Connection\Tokens;
4+
5+
class Number extends Token {}

0 commit comments

Comments
 (0)