Use pattern matching switch cases

This commit is contained in:
AsamK 2023-10-17 19:52:35 +02:00
parent 80c1a6d2af
commit 8d55dfb66b
27 changed files with 395 additions and 380 deletions

View file

@ -72,8 +72,8 @@ public class Commands {
private static void addCommand(Command command) {
commands.put(command.getName(), command);
if (command instanceof CliCommand) {
commandSubparserAttacher.put(command.getName(), ((CliCommand) command)::attachToSubparser);
if (command instanceof CliCommand cliCommand) {
commandSubparserAttacher.put(command.getName(), cliCommand::attachToSubparser);
}
}
}

View file

@ -249,11 +249,11 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
}
private void addDefaultReceiveHandler(Manager m, OutputWriter outputWriter, final boolean isWeakListener) {
final var handler = outputWriter instanceof JsonWriter o
? new JsonReceiveMessageHandler(m, o)
: outputWriter instanceof PlainTextWriter o
? new ReceiveMessageHandler(m, o)
: Manager.ReceiveMessageHandler.EMPTY;
final var handler = switch (outputWriter) {
case PlainTextWriter writer -> new ReceiveMessageHandler(m, writer);
case JsonWriter writer -> new JsonReceiveMessageHandler(m, writer);
case null -> Manager.ReceiveMessageHandler.EMPTY;
};
m.addReceiveHandler(handler, isWeakListener);
}

View file

@ -42,10 +42,9 @@ public class GetAttachmentCommand implements JsonRpcLocalCommand {
try (InputStream attachment = m.retrieveAttachment(id)) {
final var bytes = attachment.readAllBytes();
final var base64 = Base64.getEncoder().encodeToString(bytes);
if (outputWriter instanceof PlainTextWriter writer) {
writer.println(base64);
} else if (outputWriter instanceof JsonWriter writer) {
writer.write(new JsonAttachmentData(base64));
switch (outputWriter) {
case PlainTextWriter writer -> writer.println(base64);
case JsonWriter writer -> writer.write(new JsonAttachmentData(base64));
}
} catch (FileNotFoundException ex) {
throw new UserErrorException("Could not find attachment with ID: " + id, ex);

View file

@ -55,24 +55,26 @@ public class GetUserStatusCommand implements JsonRpcLocalCommand {
}
// Output
if (outputWriter instanceof JsonWriter jsonWriter) {
var jsonUserStatuses = registered.entrySet().stream().map(entry -> {
final var number = entry.getValue().number();
final var uuid = entry.getValue().uuid();
return new JsonUserStatus(entry.getKey(), number, uuid == null ? null : uuid.toString(), uuid != null);
}).toList();
jsonWriter.write(jsonUserStatuses);
} else {
final var writer = (PlainTextWriter) outputWriter;
for (var entry : registered.entrySet()) {
final var userStatus = entry.getValue();
writer.println("{}: {}{}",
entry.getKey(),
userStatus.uuid() != null,
userStatus.unrestrictedUnidentifiedAccess() ? " (unrestricted sealed sender)" : "");
switch (outputWriter) {
case JsonWriter writer -> {
var jsonUserStatuses = registered.entrySet().stream().map(entry -> {
final var number = entry.getValue().number();
final var uuid = entry.getValue().uuid();
return new JsonUserStatus(entry.getKey(),
number,
uuid == null ? null : uuid.toString(),
uuid != null);
}).toList();
writer.write(jsonUserStatuses);
}
case PlainTextWriter writer -> {
for (var entry : registered.entrySet()) {
final var userStatus = entry.getValue();
writer.println("{}: {}{}",
entry.getKey(),
userStatus.uuid() != null,
userStatus.unrestrictedUnidentifiedAccess() ? " (unrestricted sealed sender)" : "");
}
}
}
}

View file

@ -54,35 +54,38 @@ public class JoinGroupCommand implements JsonRpcLocalCommand {
try {
final var results = m.joinGroup(linkUrl);
var newGroupId = results.first();
if (outputWriter instanceof JsonWriter writer) {
var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.second().results());
if (!m.getGroup(newGroupId).isMember()) {
writer.write(Map.of("timestamp",
results.second().timestamp(),
"results",
jsonResults,
"groupId",
newGroupId.toBase64(),
"onlyRequested",
true));
} else {
writer.write(Map.of("timestamp",
results.second().timestamp(),
"results",
jsonResults,
"groupId",
newGroupId.toBase64()));
switch (outputWriter) {
case JsonWriter writer -> {
var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.second().results());
if (!m.getGroup(newGroupId).isMember()) {
writer.write(Map.of("timestamp",
results.second().timestamp(),
"results",
jsonResults,
"groupId",
newGroupId.toBase64(),
"onlyRequested",
true));
} else {
writer.write(Map.of("timestamp",
results.second().timestamp(),
"results",
jsonResults,
"groupId",
newGroupId.toBase64()));
}
}
} else {
final var writer = (PlainTextWriter) outputWriter;
if (!m.getGroup(newGroupId).isMember()) {
writer.println("Requested to join group \"{}\"", newGroupId.toBase64());
} else {
writer.println("Joined group \"{}\"", newGroupId.toBase64());
case PlainTextWriter writer -> {
if (!m.getGroup(newGroupId).isMember()) {
writer.println("Requested to join group \"{}\"", newGroupId.toBase64());
} else {
writer.println("Joined group \"{}\"", newGroupId.toBase64());
}
var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.second()
.results());
SendMessageResultUtils.printSendMessageResultErrors(writer, errors);
writer.println("{}", results.second().timestamp());
}
var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.second().results());
SendMessageResultUtils.printSendMessageResultErrors(writer, errors);
writer.println("{}", results.second().timestamp());
}
} catch (IOException e) {
throw new IOErrorException("Failed to send message: "

View file

@ -26,12 +26,15 @@ public class ListAccountsCommand implements JsonRpcMultiLocalCommand {
final Namespace ns, final MultiAccountManager c, final OutputWriter outputWriter
) throws CommandException {
final var accountNumbers = c.getAccountNumbers();
if (outputWriter instanceof JsonWriter jsonWriter) {
final var jsonAccounts = accountNumbers.stream().map(JsonAccount::new).toList();
jsonWriter.write(jsonAccounts);
} else if (outputWriter instanceof PlainTextWriter plainTextWriter) {
for (final var number : accountNumbers) {
plainTextWriter.println("Number: {}", number);
switch (outputWriter) {
case JsonWriter jsonWriter -> {
final var jsonAccounts = accountNumbers.stream().map(JsonAccount::new).toList();
jsonWriter.write(jsonAccounts);
}
case PlainTextWriter plainTextWriter -> {
for (final var number : accountNumbers) {
plainTextWriter.println("Number: {}", number);
}
}
}
}

View file

@ -51,48 +51,49 @@ public class ListContactsCommand implements JsonRpcLocalCommand {
recipientIdentifiers,
Optional.ofNullable(name));
if (outputWriter instanceof PlainTextWriter writer) {
for (var r : recipients) {
final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact();
final var profile = r.getProfile() == null ? Profile.newBuilder().build() : r.getProfile();
writer.println(
"Number: {} Name: {} Profile name: {} Username: {} Color: {} Blocked: {} Message expiration: {}",
r.getAddress().getLegacyIdentifier(),
contact.getName(),
profile.getDisplayName(),
r.getAddress().username().orElse(""),
contact.getColor(),
contact.isBlocked(),
contact.getMessageExpirationTime() == 0
? "disabled"
: contact.getMessageExpirationTime() + "s");
switch (outputWriter) {
case PlainTextWriter writer -> {
for (var r : recipients) {
final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact();
final var profile = r.getProfile() == null ? Profile.newBuilder().build() : r.getProfile();
writer.println(
"Number: {} Name: {} Profile name: {} Username: {} Color: {} Blocked: {} Message expiration: {}",
r.getAddress().getLegacyIdentifier(),
contact.getName(),
profile.getDisplayName(),
r.getAddress().username().orElse(""),
contact.getColor(),
contact.isBlocked(),
contact.getMessageExpirationTime() == 0
? "disabled"
: contact.getMessageExpirationTime() + "s");
}
}
case JsonWriter writer -> {
final var jsonContacts = recipients.stream().map(r -> {
final var address = r.getAddress();
final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact();
return new JsonContact(address.number().orElse(null),
address.uuid().map(UUID::toString).orElse(null),
address.username().orElse(null),
contact.getName(),
contact.getColor(),
contact.isBlocked(),
contact.getMessageExpirationTime(),
r.getProfile() == null
? null
: new JsonContact.JsonProfile(r.getProfile().getLastUpdateTimestamp(),
r.getProfile().getGivenName(),
r.getProfile().getFamilyName(),
r.getProfile().getAbout(),
r.getProfile().getAboutEmoji(),
r.getProfile().getMobileCoinAddress() == null
? null
: Base64.getEncoder()
.encodeToString(r.getProfile().getMobileCoinAddress())));
}).toList();
writer.write(jsonContacts);
}
} else {
final var writer = (JsonWriter) outputWriter;
final var jsonContacts = recipients.stream().map(r -> {
final var address = r.getAddress();
final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact();
return new JsonContact(address.number().orElse(null),
address.uuid().map(UUID::toString).orElse(null),
address.username().orElse(null),
contact.getName(),
contact.getColor(),
contact.isBlocked(),
contact.getMessageExpirationTime(),
r.getProfile() == null
? null
: new JsonContact.JsonProfile(r.getProfile().getLastUpdateTimestamp(),
r.getProfile().getGivenName(),
r.getProfile().getFamilyName(),
r.getProfile().getAbout(),
r.getProfile().getAboutEmoji(),
r.getProfile().getMobileCoinAddress() == null
? null
: Base64.getEncoder()
.encodeToString(r.getProfile().getMobileCoinAddress())));
}).toList();
writer.write(jsonContacts);
}
}

View file

@ -42,21 +42,23 @@ public class ListDevicesCommand implements JsonRpcLocalCommand {
throw new IOErrorException("Failed to get linked devices: " + e.getMessage(), e);
}
if (outputWriter instanceof PlainTextWriter writer) {
for (var d : devices) {
writer.println("- Device {}{}:", d.id(), (d.isThisDevice() ? " (this device)" : ""));
writer.indent(w -> {
w.println("Name: {}", d.name());
w.println("Created: {}", DateUtils.formatTimestamp(d.created()));
w.println("Last seen: {}", DateUtils.formatTimestamp(d.lastSeen()));
});
switch (outputWriter) {
case PlainTextWriter writer -> {
for (var d : devices) {
writer.println("- Device {}{}:", d.id(), (d.isThisDevice() ? " (this device)" : ""));
writer.indent(w -> {
w.println("Name: {}", d.name());
w.println("Created: {}", DateUtils.formatTimestamp(d.created()));
w.println("Last seen: {}", DateUtils.formatTimestamp(d.lastSeen()));
});
}
}
case JsonWriter writer -> {
final var jsonDevices = devices.stream()
.map(d -> new JsonDevice(d.id(), d.name(), d.created(), d.lastSeen()))
.toList();
writer.write(jsonDevices);
}
} else {
final var writer = (JsonWriter) outputWriter;
final var jsonDevices = devices.stream()
.map(d -> new JsonDevice(d.id(), d.name(), d.created(), d.lastSeen()))
.toList();
writer.write(jsonDevices);
}
}

View file

@ -89,34 +89,34 @@ public class ListGroupsCommand implements JsonRpcLocalCommand {
groups = groups.stream().filter(g -> groupIds.contains(g.groupId())).toList();
}
if (outputWriter instanceof JsonWriter jsonWriter) {
switch (outputWriter) {
case JsonWriter jsonWriter -> {
var jsonGroups = groups.stream().map(group -> {
final var groupInviteLink = group.groupInviteLinkUrl();
var jsonGroups = groups.stream().map(group -> {
final var groupInviteLink = group.groupInviteLinkUrl();
return new JsonGroup(group.groupId().toBase64(),
group.title(),
group.description(),
group.isMember(),
group.isBlocked(),
group.messageExpirationTimer(),
resolveJsonMembers(group.members()),
resolveJsonMembers(group.pendingMembers()),
resolveJsonMembers(group.requestingMembers()),
resolveJsonMembers(group.adminMembers()),
resolveJsonMembers(group.bannedMembers()),
group.permissionAddMember().name(),
group.permissionEditDetails().name(),
group.permissionSendMessage().name(),
groupInviteLink == null ? null : groupInviteLink.getUrl());
}).toList();
jsonWriter.write(jsonGroups);
} else {
final var writer = (PlainTextWriter) outputWriter;
boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed"));
for (var group : groups) {
printGroupPlainText(writer, group, detailed);
return new JsonGroup(group.groupId().toBase64(),
group.title(),
group.description(),
group.isMember(),
group.isBlocked(),
group.messageExpirationTimer(),
resolveJsonMembers(group.members()),
resolveJsonMembers(group.pendingMembers()),
resolveJsonMembers(group.requestingMembers()),
resolveJsonMembers(group.adminMembers()),
resolveJsonMembers(group.bannedMembers()),
group.permissionAddMember().name(),
group.permissionEditDetails().name(),
group.permissionSendMessage().name(),
groupInviteLink == null ? null : groupInviteLink.getUrl());
}).toList();
jsonWriter.write(jsonGroups);
}
case PlainTextWriter writer -> {
boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed"));
for (var group : groups) {
printGroupPlainText(writer, group, detailed);
}
}
}
}

View file

@ -57,28 +57,29 @@ public class ListIdentitiesCommand implements JsonRpcLocalCommand {
identities = m.getIdentities(CommandUtil.getSingleRecipientIdentifier(number, m.getSelfNumber()));
}
if (outputWriter instanceof PlainTextWriter writer) {
for (var id : identities) {
printIdentityFingerprint(writer, id);
switch (outputWriter) {
case PlainTextWriter writer -> {
for (var id : identities) {
printIdentityFingerprint(writer, id);
}
}
case JsonWriter writer -> {
final var jsonIdentities = identities.stream().map(id -> {
final var address = id.recipient();
var safetyNumber = Util.formatSafetyNumber(id.safetyNumber());
var scannableSafetyNumber = id.scannableSafetyNumber();
return new JsonIdentity(address.number().orElse(null),
address.uuid().map(UUID::toString).orElse(null),
Hex.toString(id.getFingerprint()),
safetyNumber,
scannableSafetyNumber == null
? null
: Base64.getEncoder().encodeToString(scannableSafetyNumber),
id.trustLevel().name(),
id.dateAddedTimestamp());
}).toList();
writer.write(jsonIdentities);
}
} else {
final var writer = (JsonWriter) outputWriter;
final var jsonIdentities = identities.stream().map(id -> {
final var address = id.recipient();
var safetyNumber = Util.formatSafetyNumber(id.safetyNumber());
var scannableSafetyNumber = id.scannableSafetyNumber();
return new JsonIdentity(address.number().orElse(null),
address.uuid().map(UUID::toString).orElse(null),
Hex.toString(id.getFingerprint()),
safetyNumber,
scannableSafetyNumber == null
? null
: Base64.getEncoder().encodeToString(scannableSafetyNumber),
id.trustLevel().name(),
id.dateAddedTimestamp());
}).toList();
writer.write(jsonIdentities);
}
}

View file

@ -30,17 +30,20 @@ public class ListStickerPacksCommand implements JsonRpcLocalCommand {
final Namespace ns, final Manager c, final OutputWriter outputWriter
) throws CommandException {
final var stickerPacks = c.getStickerPacks();
if (outputWriter instanceof JsonWriter jsonWriter) {
final var jsonStickerPacks = stickerPacks.stream().map(JsonStickerPack::new).toList();
jsonWriter.write(jsonStickerPacks);
} else if (outputWriter instanceof PlainTextWriter plainTextWriter) {
for (final var sticker : stickerPacks) {
plainTextWriter.println("Pack {}: “{}” by “{}” has {} stickers. {}",
Hex.toStringCondensed(sticker.packId().serialize()),
sticker.title(),
sticker.author(),
sticker.stickers().size(),
sticker.url().getUrl());
switch (outputWriter) {
case JsonWriter jsonWriter -> {
final var jsonStickerPacks = stickerPacks.stream().map(JsonStickerPack::new).toList();
jsonWriter.write(jsonStickerPacks);
}
case PlainTextWriter plainTextWriter -> {
for (final var sticker : stickerPacks) {
plainTextWriter.println("Pack {}: “{}” by “{}” has {} stickers. {}",
Hex.toStringCondensed(sticker.packId().serialize()),
sticker.title(),
sticker.author(),
sticker.stickers().size(),
sticker.url().getUrl());
}
}
}
}

View file

@ -74,8 +74,10 @@ public class ReceiveCommand implements LocalCommand, JsonRpcSingleCommand<Receiv
final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts"));
m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts));
try {
final var handler = outputWriter instanceof JsonWriter ? new JsonReceiveMessageHandler(m,
(JsonWriter) outputWriter) : new ReceiveMessageHandler(m, (PlainTextWriter) outputWriter);
final var handler = switch (outputWriter) {
case JsonWriter writer -> new JsonReceiveMessageHandler(m, writer);
case PlainTextWriter writer -> new ReceiveMessageHandler(m, writer);
};
final var duration = timeout < 0 ? null : Duration.ofMillis((long) (timeout * 1000));
final var maxMessages = maxMessagesRaw < 0 ? null : maxMessagesRaw;
m.receiveMessages(Optional.ofNullable(duration), Optional.ofNullable(maxMessages), handler);

View file

@ -50,10 +50,9 @@ public class UpdateAccountCommand implements JsonRpcLocalCommand {
if (username != null) {
try {
final var newUsername = m.setUsername(username);
if (outputWriter instanceof PlainTextWriter w) {
w.println("Your new username: {}", newUsername);
} else if (outputWriter instanceof JsonWriter w) {
w.write(new JsonAccountResponse(newUsername));
switch (outputWriter) {
case PlainTextWriter w -> w.println("Your new username: {}", newUsername);
case JsonWriter w -> w.write(new JsonAccountResponse(newUsername));
}
} catch (IOException e) {
throw new IOErrorException("Failed to set username: " + e.getMessage(), e);

View file

@ -182,27 +182,29 @@ public class UpdateGroupCommand implements JsonRpcLocalCommand {
private void outputResult(
final OutputWriter outputWriter, final SendGroupMessageResults results, final GroupId groupId
) {
if (outputWriter instanceof PlainTextWriter writer) {
if (groupId != null) {
writer.println("Created new group: \"{}\"", groupId.toBase64());
switch (outputWriter) {
case PlainTextWriter writer -> {
if (groupId != null) {
writer.println("Created new group: \"{}\"", groupId.toBase64());
}
if (results != null) {
var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.results());
SendMessageResultUtils.printSendMessageResultErrors(writer, errors);
writer.println("{}", results.timestamp());
}
}
if (results != null) {
var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.results());
SendMessageResultUtils.printSendMessageResultErrors(writer, errors);
writer.println("{}", results.timestamp());
case JsonWriter writer -> {
final var response = new HashMap<>();
if (results != null) {
response.put("timestamp", results.timestamp());
var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.results());
response.put("results", jsonResults);
}
if (groupId != null) {
response.put("groupId", groupId.toBase64());
}
writer.write(response);
}
} else {
final var writer = (JsonWriter) outputWriter;
final var response = new HashMap<>();
if (results != null) {
response.put("timestamp", results.timestamp());
var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.results());
response.put("results", jsonResults);
}
if (groupId != null) {
response.put("groupId", groupId.toBase64());
}
writer.write(response);
}
}
}

View file

@ -42,11 +42,11 @@ public class UploadStickerPackCommand implements JsonRpcLocalCommand {
try {
var url = m.uploadStickerPack(path);
if (outputWriter instanceof PlainTextWriter writer) {
writer.println("{}", url.getUrl());
} else {
final var writer = (JsonWriter) outputWriter;
writer.write(Map.of("url", url.getUrl()));
switch (outputWriter) {
case PlainTextWriter writer -> writer.println("{}", url.getUrl());
case JsonWriter writer -> {
writer.write(Map.of("url", url.getUrl()));
}
}
} catch (IOException e) {
throw new IOErrorException("Upload error (maybe image size too large):" + e.getMessage(), e);

View file

@ -56,10 +56,9 @@ public class VersionCommand implements JsonRpcLocalCommand, JsonRpcMultiLocalCom
final var projectName = BaseConfig.PROJECT_NAME == null ? "signal-cli" : BaseConfig.PROJECT_NAME;
final var version = BaseConfig.PROJECT_VERSION == null ? "unknown" : BaseConfig.PROJECT_VERSION;
if (outputWriter instanceof JsonWriter jsonWriter) {
jsonWriter.write(Map.of("version", version));
} else if (outputWriter instanceof PlainTextWriter plainTextWriter) {
plainTextWriter.println("{} {}", projectName, version);
switch (outputWriter) {
case JsonWriter jsonWriter -> jsonWriter.write(Map.of("version", version));
case PlainTextWriter plainTextWriter -> plainTextWriter.println("{} {}", projectName, version);
}
}
}