Skip to content

Commit 2adc14f

Browse files
authored
Replace example printfs with a callable (#1723)
To make it easier for users to work off the examples without having to replace all the print statements
1 parent 7a13e4f commit 2adc14f

File tree

2 files changed

+134
-79
lines changed

2 files changed

+134
-79
lines changed

examples/command_logger.php

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
namespace MongoDB\Examples\CommandLogger;
55

6+
use Closure;
7+
use Exception;
68
use MongoDB\BSON\Document;
79
use MongoDB\Client;
810
use MongoDB\Driver\Monitoring\CommandFailedEvent;
@@ -24,37 +26,56 @@ function toJSON(object $document): string
2426

2527
class CommandLogger implements CommandSubscriber
2628
{
27-
public function commandStarted(CommandStartedEvent $event): void
29+
/** @param Closure(object):void $handleOutput */
30+
public function __construct(private readonly Closure $handleOutput)
2831
{
29-
printf("%s command started\n", $event->getCommandName());
32+
}
3033

31-
printf("command: %s\n", toJson($event->getCommand()));
32-
echo "\n";
34+
public function commandStarted(CommandStartedEvent $event): void
35+
{
36+
$this->handleOutput->__invoke($event);
3337
}
3438

3539
public function commandSucceeded(CommandSucceededEvent $event): void
3640
{
37-
printf("%s command succeeded\n", $event->getCommandName());
38-
printf("reply: %s\n", toJson($event->getReply()));
39-
echo "\n";
41+
$this->handleOutput->__invoke($event);
4042
}
4143

4244
public function commandFailed(CommandFailedEvent $event): void
4345
{
44-
printf("%s command failed\n", $event->getCommandName());
45-
printf("reply: %s\n", toJson($event->getReply()));
46-
47-
$exception = $event->getError();
48-
printf("exception: %s\n", $exception::class);
49-
printf("exception.code: %d\n", $exception->getCode());
50-
printf("exception.message: %s\n", $exception->getMessage());
51-
echo "\n";
46+
$this->handleOutput->__invoke($event);
5247
}
5348
}
5449

5550
$client = new Client(getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/');
5651

57-
$client->addSubscriber(new CommandLogger());
52+
$handleOutput = function (object $event): void {
53+
switch ($event::class) {
54+
case CommandStartedEvent::class:
55+
printf("%s command started\n", $event->getCommandName());
56+
printf("command: %s\n", toJson($event->getCommand()));
57+
break;
58+
case CommandSucceededEvent::class:
59+
printf("%s command succeeded\n", $event->getCommandName());
60+
printf("reply: %s\n", toJson($event->getReply()));
61+
break;
62+
case CommandFailedEvent::class:
63+
printf("%s command failed\n", $event->getCommandName());
64+
printf("reply: %s\n", toJson($event->getReply()));
65+
66+
$exception = $event->getError();
67+
printf("exception: %s\n", $exception::class);
68+
printf("exception.code: %d\n", $exception->getCode());
69+
printf("exception.message: %s\n", $exception->getMessage());
70+
break;
71+
default:
72+
throw new Exception('Event type not supported');
73+
}
74+
75+
echo "\n";
76+
};
77+
78+
$client->addSubscriber(new CommandLogger($handleOutput));
5879

5980
$collection = $client->test->command_logger;
6081
$collection->drop();

examples/sdam_logger.php

Lines changed: 97 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
namespace MongoDB\Examples;
55

6+
use Closure;
7+
use Exception;
68
use MongoDB\BSON\Document;
79
use MongoDB\Client;
810
use MongoDB\Driver\Monitoring\SDAMSubscriber;
@@ -28,102 +30,54 @@ function toJSON(array|object $document): string
2830

2931
class SDAMLogger implements SDAMSubscriber
3032
{
33+
/** @param Closure(object):void $handleOutput */
34+
public function __construct(private readonly Closure $handleOutput)
35+
{
36+
}
37+
3138
public function serverChanged(ServerChangedEvent $event): void
3239
{
33-
printf(
34-
"serverChanged: %s:%d changed from %s to %s\n",
35-
$event->getHost(),
36-
$event->getPort(),
37-
$event->getPreviousDescription()->getType(),
38-
$event->getNewDescription()->getType(),
39-
);
40-
41-
printf("previous hello response: %s\n", toJson($event->getPreviousDescription()->getHelloResponse()));
42-
printf("new hello response: %s\n", toJson($event->getNewDescription()->getHelloResponse()));
43-
echo "\n";
40+
$this->handleOutput->__invoke($event);
4441
}
4542

4643
public function serverClosed(ServerClosedEvent $event): void
4744
{
48-
printf(
49-
"serverClosed: %s:%d was removed from topology %s\n",
50-
$event->getHost(),
51-
$event->getPort(),
52-
(string) $event->getTopologyId(),
53-
);
54-
echo "\n";
45+
$this->handleOutput->__invoke($event);
5546
}
5647

5748
public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void
5849
{
59-
printf(
60-
"serverHeartbeatFailed: %s:%d heartbeat failed after %dµs\n",
61-
$event->getHost(),
62-
$event->getPort(),
63-
$event->getDurationMicros(),
64-
);
65-
66-
$error = $event->getError();
67-
68-
printf("error: %s(%d): %s\n", $error::class, $error->getCode(), $error->getMessage());
69-
echo "\n";
50+
$this->handleOutput->__invoke($event);
7051
}
7152

7253
public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void
7354
{
74-
printf(
75-
"serverHeartbeatStarted: %s:%d heartbeat started\n",
76-
$event->getHost(),
77-
$event->getPort(),
78-
);
79-
echo "\n";
55+
$this->handleOutput->__invoke($event);
8056
}
8157

8258
public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void
8359
{
84-
printf(
85-
"serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dµs\n",
86-
$event->getHost(),
87-
$event->getPort(),
88-
$event->getDurationMicros(),
89-
);
90-
91-
printf("reply: %s\n", toJson($event->getReply()));
92-
echo "\n";
60+
$this->handleOutput->__invoke($event);
9361
}
9462

9563
public function serverOpening(ServerOpeningEvent $event): void
9664
{
97-
printf(
98-
"serverOpening: %s:%d was added to topology %s\n",
99-
$event->getHost(),
100-
$event->getPort(),
101-
(string) $event->getTopologyId(),
102-
);
103-
echo "\n";
65+
$this->handleOutput->__invoke($event);
10466
}
10567

10668
public function topologyChanged(TopologyChangedEvent $event): void
10769
{
108-
printf(
109-
"topologyChanged: %s changed from %s to %s\n",
110-
(string) $event->getTopologyId(),
111-
$event->getPreviousDescription()->getType(),
112-
$event->getNewDescription()->getType(),
113-
);
114-
echo "\n";
70+
$this->handleOutput->__invoke($event);
11571
}
11672

11773
public function topologyClosed(TopologyClosedEvent $event): void
11874
{
119-
printf("topologyClosed: %s was closed\n", (string) $event->getTopologyId());
120-
echo "\n";
75+
$this->handleOutput->__invoke($event);
12176
}
12277

12378
public function topologyOpening(TopologyOpeningEvent $event): void
12479
{
125-
printf("topologyOpening: %s was opened\n", (string) $event->getTopologyId());
126-
echo "\n";
80+
$this->handleOutput->__invoke($event);
12781
}
12882
}
12983

@@ -132,7 +86,87 @@ public function topologyOpening(TopologyOpeningEvent $event): void
13286
* (including subscribers) are freed. */
13387
$client = new Client(getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/', [], ['disableClientPersistence' => true]);
13488

135-
$client->getManager()->addSubscriber(new SDAMLogger());
89+
$handleOutput = function (object $event): void {
90+
switch ($event::class) {
91+
case ServerChangedEvent::class:
92+
printf(
93+
"serverChanged: %s:%d changed from %s to %s\n",
94+
$event->getHost(),
95+
$event->getPort(),
96+
$event->getPreviousDescription()->getType(),
97+
$event->getNewDescription()->getType(),
98+
);
99+
100+
printf("previous hello response: %s\n", toJson($event->getPreviousDescription()->getHelloResponse()));
101+
printf("new hello response: %s\n", toJson($event->getNewDescription()->getHelloResponse()));
102+
break;
103+
case ServerClosedEvent::class:
104+
printf(
105+
"serverClosed: %s:%d was removed from topology %s\n",
106+
$event->getHost(),
107+
$event->getPort(),
108+
$event->getTopologyId()->__toString(),
109+
);
110+
break;
111+
case ServerHeartbeatFailedEvent::class:
112+
printf(
113+
"serverHeartbeatFailed: %s:%d heartbeat failed after %dµs\n",
114+
$event->getHost(),
115+
$event->getPort(),
116+
$event->getDurationMicros(),
117+
);
118+
119+
$error = $event->getError();
120+
121+
printf("error: %s(%d): %s\n", $error::class, $error->getCode(), $error->getMessage());
122+
break;
123+
case ServerHeartbeatStartedEvent::class:
124+
printf(
125+
"serverHeartbeatStarted: %s:%d heartbeat started\n",
126+
$event->getHost(),
127+
$event->getPort(),
128+
);
129+
break;
130+
case ServerHeartbeatSucceededEvent::class:
131+
printf(
132+
"serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dµs\n",
133+
$event->getHost(),
134+
$event->getPort(),
135+
$event->getDurationMicros(),
136+
);
137+
138+
printf("reply: %s\n", toJson($event->getReply()));
139+
break;
140+
case ServerOpeningEvent::class:
141+
printf(
142+
"serverOpening: %s:%d was added to topology %s\n",
143+
$event->getHost(),
144+
$event->getPort(),
145+
$event->getTopologyId()->__toString(),
146+
);
147+
break;
148+
case TopologyChangedEvent::class:
149+
printf(
150+
"topologyChanged: %s changed from %s to %s\n",
151+
$event->getTopologyId()->__toString(),
152+
$event->getPreviousDescription()->getType(),
153+
$event->getNewDescription()->getType(),
154+
);
155+
break;
156+
case TopologyClosedEvent::class:
157+
printf("topologyClosed: %s was closed\n", $event->getTopologyId()->__toString());
158+
break;
159+
case TopologyOpeningEvent::class:
160+
printf("topologyOpening: %s was opened\n", $event->getTopologyId()->__toString());
161+
break;
162+
default:
163+
throw new Exception('Event type not supported');
164+
}
165+
166+
echo "\n";
167+
};
168+
169+
$client->getManager()->addSubscriber(new SDAMLogger($handleOutput));
136170

137171
$client->test->command(['ping' => 1]);
138172

0 commit comments

Comments
 (0)