Skip to content

Commit 3c0ed2d

Browse files
committed
chore: add message example
Signed-off-by: azjezz <azjezz@protonmail.com>
1 parent 160d0e6 commit 3c0ed2d

File tree

4 files changed

+104
-6
lines changed

4 files changed

+104
-6
lines changed

benchmarks/EvaluationBenchmark.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,14 @@
1010
use PhpBench\Benchmark\Metadata\Annotations\Iterations;
1111
use PhpBench\Benchmark\Metadata\Annotations\Revs;
1212
use PhpBench\Benchmark\Metadata\Annotations\Warmup;
13+
use Psl\Vec;
1314
use Symfony\Component\Cache\Adapter\NullAdapter;
1415
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
1516
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as SymfonyExpressionLanguage;
1617
use Symfony\Component\ExpressionLanguage\ParsedExpression as SymfonyExpression;
1718

18-
use function array_keys;
19-
use function assert;
2019
use function extract;
2120

22-
/**
23-
* @mago-expect lint:no-boolean-literal-comparison
24-
*/
2521
final class EvaluationBenchmark
2622
{
2723
private const string CEL_EXPRESSION = <<<'CEL'
@@ -154,7 +150,7 @@ public function benchCachedSymfonyExpression(): void
154150
$symfony->addFunction(ExpressionFunction::fromPhp('mb_strtoupper', 'toUpper'));
155151

156152
if ($expression === null) {
157-
$expression = $symfony->parse(self::SEL_EXPRESSION, array_keys(self::ENVIRONMENT));
153+
$expression = $symfony->parse(self::SEL_EXPRESSION, Vec\keys(self::ENVIRONMENT));
158154
}
159155

160156
$_ = $symfony->evaluate($expression, self::ENVIRONMENT);

examples/lexer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
declare(strict_types=1);
44

5+
namespace Cel\Examples;
6+
57
use Cel\Input\Input;
68
use Cel\Lexer\Lexer;
79
use Cel\Token\Token;

examples/message.php

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cel\Examples;
6+
7+
use Cel;
8+
use Cel\Runtime\Exception\InvalidMessageFieldsException;
9+
use Cel\Runtime\Value;
10+
use Override;
11+
use Psl;
12+
use Psl\Json;
13+
use Psl\Type;
14+
15+
require_once __DIR__ . '/../vendor/autoload.php';
16+
17+
final readonly class RequestMessage implements Cel\Runtime\Message\MessageInterface
18+
{
19+
public function __construct(
20+
public int $id,
21+
public string $name,
22+
public null|string $email,
23+
) {}
24+
25+
/**
26+
* @inheritDoc
27+
*/
28+
#[Override]
29+
public function toCelValue(): Value\Value
30+
{
31+
return new Value\MessageValue($this, [
32+
'id' => Value\Value::from($this->id),
33+
'name' => Value\Value::from($this->name),
34+
'email' => Value\Value::from($this->email),
35+
]);
36+
}
37+
38+
/**
39+
* @inheritDoc
40+
*/
41+
#[Override]
42+
public static function fromCelFields(array $fields): static
43+
{
44+
try {
45+
$fields = Type\shape([
46+
'id' => Type\instance_of(Value\IntegerValue::class),
47+
'name' => Type\instance_of(Value\StringValue::class),
48+
'email' => Type\optional(Type\union(
49+
Type\instance_of(Value\NullValue::class),
50+
Type\instance_of(Value\StringValue::class),
51+
)),
52+
])->assert($fields);
53+
54+
$id = $fields['id']->getNativeValue();
55+
$name = $fields['name']->getNativeValue();
56+
$email = isset($fields['email']) ? $fields['email']->getNativeValue() : null;
57+
58+
return new self(
59+
id: $id,
60+
name: $name,
61+
email: $email,
62+
);
63+
} catch (Type\Exception\AssertException $e) {
64+
throw new InvalidMessageFieldsException('Unable to create RequestMessage from CEL fields.', previous: $e);
65+
}
66+
}
67+
}
68+
69+
$configuration = new Cel\Runtime\Configuration(allowedMessageClasses: [
70+
RequestMessage::class,
71+
]);
72+
73+
$message = Cel\evaluate('Cel.Examples.RequestMessage { id: 1234, name: "John Doe" }', configuration: $configuration);
74+
Psl\invariant($message->getNativeValue() instanceof RequestMessage, 'Expected a RequestMessage instance.');
75+
76+
$message = Cel\evaluate(
77+
'Cel.Examples.RequestMessage { id: 1234, name: "John Doe", email: null }',
78+
configuration: $configuration,
79+
);
80+
Psl\invariant($message->getNativeValue() instanceof RequestMessage, 'Expected a RequestMessage instance.');
81+
82+
$message = Cel\evaluate(
83+
'Cel.Examples.RequestMessage { id: 1234, name: "John Doe", email: "john.doe@example.com" }',
84+
configuration: $configuration,
85+
);
86+
Psl\invariant($message->getNativeValue() instanceof RequestMessage, 'Expected a RequestMessage instance.');
87+
88+
$result = Cel\evaluate(
89+
'has(message.email) ? message.email : null',
90+
variables: ['message' => $message],
91+
configuration: $configuration,
92+
);
93+
Psl\invariant($result->getNativeValue() === 'john.doe@example.com', 'Expected email to exist');
94+
95+
Psl\IO\write_line('RequestMessage created successfully: %s', Json\encode($message->getNativeValue(), true));

examples/simple.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
declare(strict_types=1);
44

5+
namespace Cel\Examples;
6+
7+
use Cel;
58
use Psl\IO;
69

10+
use function var_export;
11+
712
require_once __DIR__ . '/../vendor/autoload.php';
813

914
const EXPRESSION = <<<CEL

0 commit comments

Comments
 (0)