-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStringBuilder.php
More file actions
69 lines (52 loc) · 1.41 KB
/
StringBuilder.php
File metadata and controls
69 lines (52 loc) · 1.41 KB
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
<?php declare(strict_types=1);
namespace Parable\Query;
class StringBuilder
{
protected const DEFAULT_GLUE = ' ';
/** @var string[] */
protected array $parts = [];
public function __construct(
protected string $glue = self::DEFAULT_GLUE
) {}
public function prepend(...$parts): void
{
array_unshift($this->parts, ...$parts);
}
public function add(...$parts): void
{
array_push($this->parts, ...$parts);
}
public function getGlue(): string
{
return $this->glue;
}
public function getParts(): array
{
return $this->parts;
}
public function isEmpty(): bool
{
return $this->parts === [];
}
public function merge(self $queryParts): self
{
if ($this->glue !== $queryParts->getGlue()) {
throw new QueryException('Cannot merge StringBuilder with different glues.');
}
if ($queryParts->isEmpty()) {
return $this;
}
$this->add(...$queryParts->getParts());
return $this;
}
public function __toString(): string
{
return trim(implode($this->glue, array_filter($this->parts)));
}
public static function fromArray(array $parts, string $glue = self::DEFAULT_GLUE): self
{
$queryParts = new self($glue);
$queryParts->add(...array_values($parts));
return $queryParts;
}
}