* Use 'switch' expression * Reverted it to the old switch casepull/1923/head
| @@ -190,37 +190,26 @@ namespace Discord | |||
| private static string FormatToExtension(StickerFormatType format) | |||
| { | |||
| switch (format) | |||
| return format switch | |||
| { | |||
| case StickerFormatType.None: | |||
| case StickerFormatType.Png: | |||
| case StickerFormatType.Apng: // In the case of the Sticker endpoint, the sticker will be available as PNG if its format_type is PNG or APNG, and as Lottie if its format_type is LOTTIE. | |||
| return "png"; | |||
| case StickerFormatType.Lottie: | |||
| return "lottie"; | |||
| default: | |||
| throw new ArgumentException(nameof(format)); | |||
| } | |||
| StickerFormatType.None or StickerFormatType.Png or StickerFormatType.Apng => "png", // In the case of the Sticker endpoint, the sticker will be available as PNG if its format_type is PNG or APNG, and as Lottie if its format_type is LOTTIE. | |||
| StickerFormatType.Lottie => "lottie", | |||
| _ => throw new ArgumentException(nameof(format)), | |||
| }; | |||
| } | |||
| private static string FormatToExtension(ImageFormat format, string imageId) | |||
| { | |||
| if (format == ImageFormat.Auto) | |||
| format = imageId.StartsWith("a_") ? ImageFormat.Gif : ImageFormat.Png; | |||
| switch (format) | |||
| return format switch | |||
| { | |||
| case ImageFormat.Gif: | |||
| return "gif"; | |||
| case ImageFormat.Jpeg: | |||
| return "jpeg"; | |||
| case ImageFormat.Png: | |||
| return "png"; | |||
| case ImageFormat.WebP: | |||
| return "webp"; | |||
| default: | |||
| throw new ArgumentException(nameof(format)); | |||
| } | |||
| ImageFormat.Gif => "gif", | |||
| ImageFormat.Jpeg => "jpeg", | |||
| ImageFormat.Png => "png", | |||
| ImageFormat.WebP => "webp", | |||
| _ => throw new ArgumentException(nameof(format)), | |||
| }; | |||
| } | |||
| } | |||
| } | |||
| @@ -53,21 +53,13 @@ namespace Discord | |||
| if (value == null) | |||
| throw new ArgumentNullException("Value cannot be null"); | |||
| switch (value) | |||
| _value = value switch | |||
| { | |||
| case string str: | |||
| _value = str; | |||
| break; | |||
| case int integer: | |||
| _value = integer; | |||
| break; | |||
| case double number: | |||
| _value = number; | |||
| break; | |||
| default: | |||
| throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"); | |||
| } | |||
| string str => str, | |||
| int integer => integer, | |||
| double number => number, | |||
| _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"), | |||
| }; | |||
| } | |||
| } | |||
| @@ -24,15 +24,15 @@ namespace Discord | |||
| /// <exception cref="ArgumentException">Unknown channel type.</exception> | |||
| public static ChannelPermissions All(IChannel channel) | |||
| { | |||
| switch (channel) | |||
| return channel switch | |||
| { | |||
| case ITextChannel _: return Text; | |||
| case IVoiceChannel _: return Voice; | |||
| case ICategoryChannel _: return Category; | |||
| case IDMChannel _: return DM; | |||
| case IGroupChannel _: return Group; | |||
| default: throw new ArgumentException(message: "Unknown channel type.", paramName: nameof(channel)); | |||
| } | |||
| ITextChannel _ => Text, | |||
| IVoiceChannel _ => Voice, | |||
| ICategoryChannel _ => Category, | |||
| IDMChannel _ => DM, | |||
| IGroupChannel _ => Group, | |||
| _ => throw new ArgumentException(message: "Unknown channel type.", paramName: nameof(channel)), | |||
| }; | |||
| } | |||
| /// <summary> Gets a packed value representing all the permissions in this <see cref="ChannelPermissions"/>. </summary> | |||
| @@ -22,15 +22,12 @@ namespace Discord.API | |||
| Type = c.Type; | |||
| Components = c.Components?.Select<IMessageComponent, IMessageComponent>(x => | |||
| { | |||
| switch (x.Type) | |||
| return x.Type switch | |||
| { | |||
| case ComponentType.Button: | |||
| return new ButtonComponent(x as Discord.ButtonComponent); | |||
| case ComponentType.SelectMenu: | |||
| return new SelectMenuComponent(x as Discord.SelectMenuComponent); | |||
| default: return null; | |||
| } | |||
| ComponentType.Button => new ButtonComponent(x as Discord.ButtonComponent), | |||
| ComponentType.SelectMenu => new SelectMenuComponent(x as Discord.SelectMenuComponent), | |||
| _ => null, | |||
| }; | |||
| }).ToArray(); | |||
| } | |||
| @@ -715,22 +715,12 @@ namespace Discord.API | |||
| int limit = args.Limit.GetValueOrDefault(DiscordConfig.MaxMessagesPerBatch); | |||
| ulong? relativeId = args.RelativeMessageId.IsSpecified ? args.RelativeMessageId.Value : (ulong?)null; | |||
| string relativeDir; | |||
| switch (args.RelativeDirection.GetValueOrDefault(Direction.Before)) | |||
| var relativeDir = args.RelativeDirection.GetValueOrDefault(Direction.Before) switch | |||
| { | |||
| case Direction.Before: | |||
| default: | |||
| relativeDir = "before"; | |||
| break; | |||
| case Direction.After: | |||
| relativeDir = "after"; | |||
| break; | |||
| case Direction.Around: | |||
| relativeDir = "around"; | |||
| break; | |||
| } | |||
| Direction.After => "after", | |||
| Direction.Around => "around", | |||
| _ => "before", | |||
| }; | |||
| var ids = new BucketIds(channelId: channelId); | |||
| Expression<Func<string>> endpoint; | |||
| if (relativeId != null) | |||
| @@ -2181,15 +2171,14 @@ namespace Discord.API | |||
| internal static int? GetIndex(string name) | |||
| { | |||
| switch (name) | |||
| return name switch | |||
| { | |||
| case "httpMethod": return 0; | |||
| case "guildId": return 1; | |||
| case "channelId": return 2; | |||
| case "webhookId": return 3; | |||
| default: | |||
| return null; | |||
| } | |||
| "httpMethod" => 0, | |||
| "guildId" => 1, | |||
| "channelId" => 2, | |||
| "webhookId" => 3, | |||
| _ => null, | |||
| }; | |||
| } | |||
| } | |||
| @@ -22,33 +22,23 @@ namespace Discord.Rest | |||
| /// <exception cref="InvalidOperationException">Unexpected channel type.</exception> | |||
| internal static RestChannel Create(BaseDiscordClient discord, Model model) | |||
| { | |||
| switch (model.Type) | |||
| return model.Type switch | |||
| { | |||
| case ChannelType.News: | |||
| case ChannelType.Text: | |||
| case ChannelType.Voice: | |||
| return RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model); | |||
| case ChannelType.DM: | |||
| case ChannelType.Group: | |||
| return CreatePrivate(discord, model) as RestChannel; | |||
| case ChannelType.Category: | |||
| return RestCategoryChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model); | |||
| default: | |||
| return new RestChannel(discord, model.Id); | |||
| } | |||
| ChannelType.News or ChannelType.Text or ChannelType.Voice => RestGuildChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), | |||
| ChannelType.DM or ChannelType.Group => CreatePrivate(discord, model) as RestChannel, | |||
| ChannelType.Category => RestCategoryChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model), | |||
| _ => new RestChannel(discord, model.Id), | |||
| }; | |||
| } | |||
| /// <exception cref="InvalidOperationException">Unexpected channel type.</exception> | |||
| internal static IRestPrivateChannel CreatePrivate(BaseDiscordClient discord, Model model) | |||
| { | |||
| switch (model.Type) | |||
| return model.Type switch | |||
| { | |||
| case ChannelType.DM: | |||
| return RestDMChannel.Create(discord, model); | |||
| case ChannelType.Group: | |||
| return RestGroupChannel.Create(discord, model); | |||
| default: | |||
| throw new InvalidOperationException($"Unexpected channel type: {model.Type}"); | |||
| } | |||
| ChannelType.DM => RestDMChannel.Create(discord, model), | |||
| ChannelType.Group => RestGroupChannel.Create(discord, model), | |||
| _ => throw new InvalidOperationException($"Unexpected channel type: {model.Type}"), | |||
| }; | |||
| } | |||
| internal virtual void Update(Model model) { } | |||
| @@ -33,23 +33,16 @@ namespace Discord.Rest | |||
| } | |||
| internal static RestGuildChannel Create(BaseDiscordClient discord, IGuild guild, Model model) | |||
| { | |||
| switch (model.Type) | |||
| return model.Type switch | |||
| { | |||
| case ChannelType.News: | |||
| return RestNewsChannel.Create(discord, guild, model); | |||
| case ChannelType.Text: | |||
| return RestTextChannel.Create(discord, guild, model); | |||
| case ChannelType.Voice: | |||
| return RestVoiceChannel.Create(discord, guild, model); | |||
| case ChannelType.Stage: | |||
| return RestStageChannel.Create(discord, guild, model); | |||
| case ChannelType.Category: | |||
| return RestCategoryChannel.Create(discord, guild, model); | |||
| case ChannelType.PublicThread or ChannelType.PrivateThread or ChannelType.NewsThread: | |||
| return RestThreadChannel.Create(discord, guild, model); | |||
| default: | |||
| return new RestGuildChannel(discord, guild, model.Id); | |||
| } | |||
| ChannelType.News => RestNewsChannel.Create(discord, guild, model), | |||
| ChannelType.Text => RestTextChannel.Create(discord, guild, model), | |||
| ChannelType.Voice => RestVoiceChannel.Create(discord, guild, model), | |||
| ChannelType.Stage => RestStageChannel.Create(discord, guild, model), | |||
| ChannelType.Category => RestCategoryChannel.Create(discord, guild, model), | |||
| ChannelType.PublicThread or ChannelType.PrivateThread or ChannelType.NewsThread => RestThreadChannel.Create(discord, guild, model), | |||
| _ => new RestGuildChannel(discord, guild, model.Id), | |||
| }; | |||
| } | |||
| internal override void Update(Model model) | |||
| { | |||
| @@ -43,7 +43,7 @@ namespace Discord.Rest | |||
| RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); | |||
| return entity; | |||
| } | |||
| #endregion | |||
| #endregion | |||
| #region Global commands | |||
| public static async Task<RestGlobalCommand> GetGlobalCommandAsync(BaseDiscordClient client, ulong id, | |||
| @@ -13,28 +13,19 @@ namespace Discord.Net.Converters | |||
| public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | |||
| { | |||
| switch ((string)reader.Value) | |||
| return (string)reader.Value switch | |||
| { | |||
| case "rich": | |||
| return EmbedType.Rich; | |||
| case "link": | |||
| return EmbedType.Link; | |||
| case "video": | |||
| return EmbedType.Video; | |||
| case "image": | |||
| return EmbedType.Image; | |||
| case "gifv": | |||
| return EmbedType.Gifv; | |||
| case "article": | |||
| return EmbedType.Article; | |||
| case "tweet": | |||
| return EmbedType.Tweet; | |||
| case "html": | |||
| return EmbedType.Html; | |||
| case "application_news": // TODO 2.2 EmbedType.News | |||
| default: | |||
| return EmbedType.Unknown; | |||
| } | |||
| "rich" => EmbedType.Rich, | |||
| "link" => EmbedType.Link, | |||
| "video" => EmbedType.Video, | |||
| "image" => EmbedType.Image, | |||
| "gifv" => EmbedType.Gifv, | |||
| "article" => EmbedType.Article, | |||
| "tweet" => EmbedType.Tweet, | |||
| "html" => EmbedType.Html, | |||
| // TODO 2.2 EmbedType.News | |||
| _ => EmbedType.Unknown, | |||
| }; | |||
| } | |||
| public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | |||
| @@ -1,4 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| namespace Discord.Net.Converters | |||
| @@ -13,21 +13,15 @@ namespace Discord.Net.Converters | |||
| public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | |||
| { | |||
| switch ((string)reader.Value) | |||
| return (string)reader.Value switch | |||
| { | |||
| case "online": | |||
| return UserStatus.Online; | |||
| case "idle": | |||
| return UserStatus.Idle; | |||
| case "dnd": | |||
| return UserStatus.DoNotDisturb; | |||
| case "invisible": | |||
| return UserStatus.Invisible; //Should never happen | |||
| case "offline": | |||
| return UserStatus.Offline; | |||
| default: | |||
| throw new JsonSerializationException("Unknown user status"); | |||
| } | |||
| "online" => UserStatus.Online, | |||
| "idle" => UserStatus.Idle, | |||
| "dnd" => UserStatus.DoNotDisturb, | |||
| "invisible" => UserStatus.Invisible,//Should never happen | |||
| "offline" => UserStatus.Offline, | |||
| _ => throw new JsonSerializationException("Unknown user status"), | |||
| }; | |||
| } | |||
| public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | |||
| @@ -157,15 +157,15 @@ namespace Discord.Net.Rest | |||
| private static readonly HttpMethod Patch = new HttpMethod("PATCH"); | |||
| private HttpMethod GetMethod(string method) | |||
| { | |||
| switch (method) | |||
| return method switch | |||
| { | |||
| case "DELETE": return HttpMethod.Delete; | |||
| case "GET": return HttpMethod.Get; | |||
| case "PATCH": return Patch; | |||
| case "POST": return HttpMethod.Post; | |||
| case "PUT": return HttpMethod.Put; | |||
| default: throw new ArgumentOutOfRangeException(nameof(method), $"Unknown HttpMethod: {method}"); | |||
| } | |||
| "DELETE" => HttpMethod.Delete, | |||
| "GET" => HttpMethod.Get, | |||
| "PATCH" => Patch, | |||
| "POST" => HttpMethod.Post, | |||
| "PUT" => HttpMethod.Put, | |||
| _ => throw new ArgumentOutOfRangeException(nameof(method), $"Unknown HttpMethod: {method}"), | |||
| }; | |||
| } | |||
| } | |||
| } | |||
| @@ -31,15 +31,12 @@ namespace Discord.WebSocket | |||
| /// <exception cref="InvalidOperationException">Unexpected channel type is created.</exception> | |||
| internal static ISocketPrivateChannel CreatePrivate(DiscordSocketClient discord, ClientState state, Model model) | |||
| { | |||
| switch (model.Type) | |||
| return model.Type switch | |||
| { | |||
| case ChannelType.DM: | |||
| return SocketDMChannel.Create(discord, state, model); | |||
| case ChannelType.Group: | |||
| return SocketGroupChannel.Create(discord, state, model); | |||
| default: | |||
| throw new InvalidOperationException($"Unexpected channel type: {model.Type}"); | |||
| } | |||
| ChannelType.DM => SocketDMChannel.Create(discord, state, model), | |||
| ChannelType.Group => SocketGroupChannel.Create(discord, state, model), | |||
| _ => throw new InvalidOperationException($"Unexpected channel type: {model.Type}"), | |||
| }; | |||
| } | |||
| internal abstract void Update(ClientState state, Model model); | |||
| #endregion | |||
| @@ -79,13 +79,13 @@ namespace Discord.WebSocket | |||
| public static SocketMessage RemoveMessage(ISocketMessageChannel channel, DiscordSocketClient discord, | |||
| ulong id) | |||
| { | |||
| switch (channel) | |||
| return channel switch | |||
| { | |||
| case SocketDMChannel dmChannel: return dmChannel.RemoveMessage(id); | |||
| case SocketGroupChannel groupChannel: return groupChannel.RemoveMessage(id); | |||
| case SocketTextChannel textChannel: return textChannel.RemoveMessage(id); | |||
| default: throw new NotSupportedException($"Unexpected {nameof(ISocketMessageChannel)} type."); | |||
| } | |||
| SocketDMChannel dmChannel => dmChannel.RemoveMessage(id), | |||
| SocketGroupChannel groupChannel => groupChannel.RemoveMessage(id), | |||
| SocketTextChannel textChannel => textChannel.RemoveMessage(id), | |||
| _ => throw new NotSupportedException($"Unexpected {nameof(ISocketMessageChannel)} type."), | |||
| }; | |||
| } | |||
| } | |||
| } | |||
| @@ -47,23 +47,16 @@ namespace Discord.WebSocket | |||
| } | |||
| internal static SocketGuildChannel Create(SocketGuild guild, ClientState state, Model model) | |||
| { | |||
| switch (model.Type) | |||
| return model.Type switch | |||
| { | |||
| case ChannelType.News: | |||
| return SocketNewsChannel.Create(guild, state, model); | |||
| case ChannelType.Text: | |||
| return SocketTextChannel.Create(guild, state, model); | |||
| case ChannelType.Voice: | |||
| return SocketVoiceChannel.Create(guild, state, model); | |||
| case ChannelType.Category: | |||
| return SocketCategoryChannel.Create(guild, state, model); | |||
| case ChannelType.PrivateThread or ChannelType.PublicThread or ChannelType.NewsThread: | |||
| return SocketThreadChannel.Create(guild, state, model); | |||
| case ChannelType.Stage: | |||
| return SocketStageChannel.Create(guild, state, model); | |||
| default: | |||
| return new SocketGuildChannel(guild.Discord, model.Id, guild); | |||
| } | |||
| ChannelType.News => SocketNewsChannel.Create(guild, state, model), | |||
| ChannelType.Text => SocketTextChannel.Create(guild, state, model), | |||
| ChannelType.Voice => SocketVoiceChannel.Create(guild, state, model), | |||
| ChannelType.Category => SocketCategoryChannel.Create(guild, state, model), | |||
| ChannelType.PrivateThread or ChannelType.PublicThread or ChannelType.NewsThread => SocketThreadChannel.Create(guild, state, model), | |||
| ChannelType.Stage => SocketStageChannel.Create(guild, state, model), | |||
| _ => new SocketGuildChannel(guild.Discord, model.Id, guild), | |||
| }; | |||
| } | |||
| /// <inheritdoc /> | |||
| internal override void Update(ClientState state, Model model) | |||
| @@ -72,16 +72,13 @@ namespace Discord.WebSocket | |||
| if (dataModel == null) | |||
| return null; | |||
| switch (dataModel.Type) | |||
| return dataModel.Type switch | |||
| { | |||
| case ApplicationCommandType.Slash: | |||
| return SocketSlashCommand.Create(client, model, channel); | |||
| case ApplicationCommandType.Message: | |||
| return SocketMessageCommand.Create(client, model, channel); | |||
| case ApplicationCommandType.User: | |||
| return SocketUserCommand.Create(client, model, channel); | |||
| default: return null; | |||
| } | |||
| ApplicationCommandType.Slash => SocketSlashCommand.Create(client, model, channel), | |||
| ApplicationCommandType.Message => SocketMessageCommand.Create(client, model, channel), | |||
| ApplicationCommandType.User => SocketUserCommand.Create(client, model, channel), | |||
| _ => null, | |||
| }; | |||
| } | |||
| else if (model.Type == InteractionType.MessageComponent) | |||
| return SocketMessageComponent.Create(client, model, channel); | |||
| @@ -31,16 +31,16 @@ namespace Discord.WebSocket | |||
| { | |||
| get | |||
| { | |||
| switch (Channel) | |||
| return Channel switch | |||
| { | |||
| case IVoiceChannel voiceChannel: return ChannelType.Voice; | |||
| case ICategoryChannel categoryChannel: return ChannelType.Category; | |||
| case IDMChannel dmChannel: return ChannelType.DM; | |||
| case IGroupChannel groupChannel: return ChannelType.Group; | |||
| case INewsChannel newsChannel: return ChannelType.News; | |||
| case ITextChannel textChannel: return ChannelType.Text; | |||
| default: throw new InvalidOperationException("Invalid channel type."); | |||
| } | |||
| IVoiceChannel voiceChannel => ChannelType.Voice, | |||
| ICategoryChannel categoryChannel => ChannelType.Category, | |||
| IDMChannel dmChannel => ChannelType.DM, | |||
| IGroupChannel groupChannel => ChannelType.Group, | |||
| INewsChannel newsChannel => ChannelType.News, | |||
| ITextChannel textChannel => ChannelType.Text, | |||
| _ => throw new InvalidOperationException("Invalid channel type."), | |||
| }; | |||
| } | |||
| } | |||
| /// <inheritdoc /> | |||