From e771e592fdd7681feeae8c7b0a425be265d13bce Mon Sep 17 00:00:00 2001 From: Alina Sireneva Date: Sun, 24 Sep 2023 02:40:41 +0300 Subject: [PATCH] feat: assertTypeIsNot closes MTQ-64 --- packages/client/src/methods/dialogs/parse-dialogs.ts | 11 +++-------- packages/client/src/methods/files/upload-media.ts | 8 +++----- .../src/methods/invite-links/get-invite-links.ts | 6 ++---- packages/client/src/methods/messages/get-history.ts | 6 ++---- .../src/methods/messages/get-messages-unsafe.ts | 7 +++---- packages/client/src/methods/messages/get-messages.ts | 7 +++---- .../src/methods/messages/get-scheduled-messages.ts | 7 +++---- packages/client/src/methods/messages/search-global.ts | 8 +++----- .../client/src/methods/messages/search-messages.ts | 8 +++----- packages/client/src/types/messages/message.ts | 5 ++--- packages/client/src/types/peers/chat-invite-link.ts | 6 ++---- packages/core/src/utils/type-assertions.ts | 10 ++++++++++ 12 files changed, 39 insertions(+), 50 deletions(-) diff --git a/packages/client/src/methods/dialogs/parse-dialogs.ts b/packages/client/src/methods/dialogs/parse-dialogs.ts index 3bce4e9e..3cd2e4f0 100644 --- a/packages/client/src/methods/dialogs/parse-dialogs.ts +++ b/packages/client/src/methods/dialogs/parse-dialogs.ts @@ -1,4 +1,5 @@ -import { getMarkedPeerId, MtTypeAssertionError } from '@mtcute/core' +import { getMarkedPeerId } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -9,13 +10,7 @@ export function _parseDialogs( this: TelegramClient, res: tl.messages.TypeDialogs | tl.messages.TypePeerDialogs, ): Dialog[] { - if (res._ === 'messages.dialogsNotModified') { - throw new MtTypeAssertionError( - 'messages.getPeerDialogs', - '!messages.dialogsNotModified', - 'messages.dialogsNotModified', - ) - } + assertTypeIsNot('parseDialogs', res, 'messages.dialogsNotModified') const peers = PeersIndex.from(res) diff --git a/packages/client/src/methods/files/upload-media.ts b/packages/client/src/methods/files/upload-media.ts index 23165728..a4b8a949 100644 --- a/packages/client/src/methods/files/upload-media.ts +++ b/packages/client/src/methods/files/upload-media.ts @@ -1,5 +1,5 @@ -import { assertNever, MtArgumentError, MtTypeAssertionError } from '@mtcute/core' -import { assertTypeIs } from '@mtcute/core/utils' +import { assertNever, MtArgumentError } from '@mtcute/core' +import { assertTypeIs, assertTypeIsNot } from '@mtcute/core/utils' import { TelegramClient } from '../../client' import { InputMediaLike, InputPeerLike, MessageMedia, Photo, RawDocument } from '../../types' @@ -61,9 +61,7 @@ export async function uploadMedia( media: normMedia, }) - if (res._ === 'messageMediaEmpty') { - throw new MtTypeAssertionError('uploadMedia', 'not messageMediaEmpty', 'messageMediaEmpty') - } + assertTypeIsNot('uploadMedia', res, 'messageMediaEmpty') switch (normMedia._) { case 'inputMediaUploadedPhoto': diff --git a/packages/client/src/methods/invite-links/get-invite-links.ts b/packages/client/src/methods/invite-links/get-invite-links.ts index 28a4303c..e5ee002d 100644 --- a/packages/client/src/methods/invite-links/get-invite-links.ts +++ b/packages/client/src/methods/invite-links/get-invite-links.ts @@ -1,4 +1,4 @@ -import { MtTypeAssertionError } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -69,9 +69,7 @@ export async function* getInviteLinks( const last = res.invites[res.invites.length - 1] - if (last._ === 'chatInvitePublicJoinRequests') { - throw new MtTypeAssertionError('getInviteLinks', 'chatInviteExported', last._) - } + assertTypeIsNot('getInviteLinks', last, 'chatInvitePublicJoinRequests') offsetDate = last.date offsetLink = last.link diff --git a/packages/client/src/methods/messages/get-history.ts b/packages/client/src/methods/messages/get-history.ts index a90e76c3..1a93654a 100644 --- a/packages/client/src/methods/messages/get-history.ts +++ b/packages/client/src/methods/messages/get-history.ts @@ -1,6 +1,6 @@ import Long from 'long' -import { MtTypeAssertionError } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { TelegramClient } from '../../client' import { InputPeerLike, Message, PeersIndex } from '../../types' @@ -105,9 +105,7 @@ export async function* getHistory( hash: Long.ZERO, }) - if (res._ === 'messages.messagesNotModified') { - throw new MtTypeAssertionError('messages.getHistory', '!messages.messagesNotModified', res._) - } + assertTypeIsNot('getHistory', res, 'messages.messagesNotModified') const peers = PeersIndex.from(res) diff --git a/packages/client/src/methods/messages/get-messages-unsafe.ts b/packages/client/src/methods/messages/get-messages-unsafe.ts index ea992eec..8307d013 100644 --- a/packages/client/src/methods/messages/get-messages-unsafe.ts +++ b/packages/client/src/methods/messages/get-messages-unsafe.ts @@ -1,4 +1,5 @@ -import { MaybeArray, MtTypeAssertionError } from '@mtcute/core' +import { MaybeArray } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -64,9 +65,7 @@ export async function getMessagesUnsafe( id: ids, }) - if (res._ === 'messages.messagesNotModified') { - throw new MtTypeAssertionError('getMessages', '!messages.messagesNotModified', res._) - } + assertTypeIsNot('getMessagesUnsafe', res, 'messages.messagesNotModified') const peers = PeersIndex.from(res) diff --git a/packages/client/src/methods/messages/get-messages.ts b/packages/client/src/methods/messages/get-messages.ts index b310e39e..a6c4cda5 100644 --- a/packages/client/src/methods/messages/get-messages.ts +++ b/packages/client/src/methods/messages/get-messages.ts @@ -1,4 +1,5 @@ -import { MaybeArray, MtTypeAssertionError } from '@mtcute/core' +import { MaybeArray } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -74,9 +75,7 @@ export async function getMessages( }, ) - if (res._ === 'messages.messagesNotModified') { - throw new MtTypeAssertionError('getMessages', '!messages.messagesNotModified', res._) - } + assertTypeIsNot('getMessages', res, 'messages.messagesNotModified') const peers = PeersIndex.from(res) diff --git a/packages/client/src/methods/messages/get-scheduled-messages.ts b/packages/client/src/methods/messages/get-scheduled-messages.ts index d9c1abfb..43dd296d 100644 --- a/packages/client/src/methods/messages/get-scheduled-messages.ts +++ b/packages/client/src/methods/messages/get-scheduled-messages.ts @@ -1,4 +1,5 @@ -import { MaybeArray, MtTypeAssertionError } from '@mtcute/core' +import { MaybeArray } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { TelegramClient } from '../../client' import { InputPeerLike, Message, PeersIndex } from '../../types' @@ -48,9 +49,7 @@ export async function getScheduledMessages( id: messageIds as number[], }) - if (res._ === 'messages.messagesNotModified') { - throw new MtTypeAssertionError('getMessages', '!messages.messagesNotModified', res._) - } + assertTypeIsNot('getScheduledMessages', res, 'messages.messagesNotModified') const peers = PeersIndex.from(res) diff --git a/packages/client/src/methods/messages/search-global.ts b/packages/client/src/methods/messages/search-global.ts index fac71565..a40dc294 100644 --- a/packages/client/src/methods/messages/search-global.ts +++ b/packages/client/src/methods/messages/search-global.ts @@ -1,4 +1,4 @@ -import { MtTypeAssertionError } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -58,7 +58,7 @@ export async function* searchGlobal( let offsetId = 0 for (;;) { - const res = await this.call({ + const res: tl.RpcCallReturn['messages.searchGlobal'] = await this.call({ _: 'messages.searchGlobal', q: params.query || '', filter: params.filter || SearchFilters.Empty, @@ -70,9 +70,7 @@ export async function* searchGlobal( limit: Math.min(limit, total - current), }) - if (res._ === 'messages.messagesNotModified') { - throw new MtTypeAssertionError('messages.searchGlobal', '!messages.messagesNotModified', res._) - } + assertTypeIsNot('searchGlobal', res, 'messages.messagesNotModified') const peers = PeersIndex.from(res) diff --git a/packages/client/src/methods/messages/search-messages.ts b/packages/client/src/methods/messages/search-messages.ts index 76ee2129..5ee1bd1b 100644 --- a/packages/client/src/methods/messages/search-messages.ts +++ b/packages/client/src/methods/messages/search-messages.ts @@ -1,6 +1,6 @@ import Long from 'long' -import { MtTypeAssertionError } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -126,7 +126,7 @@ export async function* searchMessages( const fromUser = (params.fromUser ? await this.resolvePeer(params.fromUser) : null) || undefined for (;;) { - const res = await this.call({ + const res: tl.RpcCallReturn['messages.search'] = await this.call({ _: 'messages.search', peer, q: params.query || '', @@ -142,9 +142,7 @@ export async function* searchMessages( hash: Long.ZERO, }) - if (res._ === 'messages.messagesNotModified') { - throw new MtTypeAssertionError('messages.search', '!messages.messagesNotModified', res._) - } + assertTypeIsNot('searchMessages', res, 'messages.messagesNotModified') // for successive chunks, we need to reset the offset offset = 0 diff --git a/packages/client/src/types/messages/message.ts b/packages/client/src/types/messages/message.ts index 88643b3e..9cebb6fd 100644 --- a/packages/client/src/types/messages/message.ts +++ b/packages/client/src/types/messages/message.ts @@ -1,4 +1,5 @@ import { assertNever, getMarkedPeerId, MtArgumentError, MtTypeAssertionError, toggleChannelIdMark } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -103,9 +104,7 @@ export class Message { */ readonly isScheduled = false, ) { - if (raw._ === 'messageEmpty') { - throw new MtTypeAssertionError('Message#ctor', 'not messageEmpty', 'messageEmpty') - } + assertTypeIsNot('Message#ctor', raw, 'messageEmpty') this.raw = raw } diff --git a/packages/client/src/types/peers/chat-invite-link.ts b/packages/client/src/types/peers/chat-invite-link.ts index d203eb27..b8d58284 100644 --- a/packages/client/src/types/peers/chat-invite-link.ts +++ b/packages/client/src/types/peers/chat-invite-link.ts @@ -1,4 +1,4 @@ -import { MtTypeAssertionError } from '@mtcute/core' +import { assertTypeIsNot } from '@mtcute/core/utils' import { tl } from '@mtcute/tl' import { TelegramClient } from '../../client' @@ -39,9 +39,7 @@ export class ChatInviteLink { raw: tl.RawChatInviteExported constructor(readonly client: TelegramClient, raw: tl.TypeExportedChatInvite, readonly _peers?: PeersIndex) { - if (raw._ === 'chatInvitePublicJoinRequests') { - throw new MtTypeAssertionError('ChatInviteLink', 'chatInviteExported', raw._) - } + assertTypeIsNot('ChatInviteLink', raw, 'chatInvitePublicJoinRequests') this.raw = raw } diff --git a/packages/core/src/utils/type-assertions.ts b/packages/core/src/utils/type-assertions.ts index fba532e4..46d9b85b 100644 --- a/packages/core/src/utils/type-assertions.ts +++ b/packages/core/src/utils/type-assertions.ts @@ -60,6 +60,16 @@ export function assertTypeIs( } } +export function assertTypeIsNot( + context: string, + obj: T, + expectedNot: K, +): asserts obj is Exclude> { + if (obj._ === expectedNot) { + throw new MtTypeAssertionError(context, 'not ' + expectedNot, obj._) + } +} + export function mtpAssertTypeIs( context: string, obj: T,