FlatBuffers implementation debugging

This commit is contained in:
Isaac 2025-03-19 18:56:39 +01:00
parent b732a6c578
commit 7e2c6da812
15 changed files with 139 additions and 107 deletions

View File

@ -101,6 +101,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
case compressedEmojiCache(Bool)
case storiesJpegExperiment(Bool)
case conferenceDebug(Bool)
case checkSerializedData(Bool)
case enableQuickReactionSwitch(Bool)
case disableReloginTokens(Bool)
case liveStreamV2(Bool)
@ -133,7 +134,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
return DebugControllerSection.web.rawValue
case .keepChatNavigationStack, .skipReadHistory, .dustEffect, .crashOnSlowQueries, .crashOnMemoryPressure:
return DebugControllerSection.experiments.rawValue
case .clearTips, .resetNotifications, .crash, .fillLocalSavedMessageCache, .resetDatabase, .resetDatabaseAndCache, .resetHoles, .resetTagHoles, .reindexUnread, .resetCacheIndex, .reindexCache, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .compressedEmojiCache, .storiesJpegExperiment, .conferenceDebug, .enableQuickReactionSwitch, .experimentalCompatibility, .enableDebugDataDisplay, .rippleEffect, .browserExperiment, .localTranscription, .enableReactionOverrides, .restorePurchases, .disableReloginTokens, .liveStreamV2, .experimentalCallMute, .playerV2, .devRequests, .fakeAds, .enableLocalTranslation:
case .clearTips, .resetNotifications, .crash, .fillLocalSavedMessageCache, .resetDatabase, .resetDatabaseAndCache, .resetHoles, .resetTagHoles, .reindexUnread, .resetCacheIndex, .reindexCache, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .compressedEmojiCache, .storiesJpegExperiment, .conferenceDebug, .checkSerializedData, .enableQuickReactionSwitch, .experimentalCompatibility, .enableDebugDataDisplay, .rippleEffect, .browserExperiment, .localTranscription, .enableReactionOverrides, .restorePurchases, .disableReloginTokens, .liveStreamV2, .experimentalCallMute, .playerV2, .devRequests, .fakeAds, .enableLocalTranslation:
return DebugControllerSection.experiments.rawValue
case .logTranslationRecognition, .resetTranslationStates:
return DebugControllerSection.translation.rawValue
@ -244,12 +245,14 @@ private enum DebugControllerEntry: ItemListNodeEntry {
return 48
case .conferenceDebug:
return 49
case .enableQuickReactionSwitch:
case .checkSerializedData:
return 50
case .liveStreamV2:
case .enableQuickReactionSwitch:
return 51
case .experimentalCallMute:
case .liveStreamV2:
return 52
case .experimentalCallMute:
return 53
case .playerV2:
return 54
case .devRequests:
@ -1318,6 +1321,16 @@ private enum DebugControllerEntry: ItemListNodeEntry {
})
}).start()
})
case let .checkSerializedData(value):
return ItemListSwitchItem(presentationData: presentationData, title: "Check Serialized Data", value: value, sectionId: self.section, style: .blocks, updated: { value in
let _ = arguments.sharedContext.accountManager.transaction ({ transaction in
transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { settings in
var settings = settings?.get(ExperimentalUISettings.self) ?? ExperimentalUISettings.defaultSettings
settings.checkSerializedData = value
return PreferencesEntry(settings)
})
}).start()
})
case let .enableQuickReactionSwitch(value):
return ItemListSwitchItem(presentationData: presentationData, title: "Enable Quick Reaction", value: value, sectionId: self.section, style: .blocks, updated: { value in
let _ = arguments.sharedContext.accountManager.transaction ({ transaction in
@ -1540,6 +1553,7 @@ private func debugControllerEntries(sharedContext: SharedAccountContext, present
entries.append(.disableReloginTokens(experimentalSettings.disableReloginTokens))
entries.append(.conferenceDebug(experimentalSettings.conferenceDebug))
entries.append(.checkSerializedData(experimentalSettings.checkSerializedData))
entries.append(.enableQuickReactionSwitch(!experimentalSettings.disableQuickReaction))
entries.append(.liveStreamV2(experimentalSettings.liveStreamV2))
entries.append(.experimentalCallMute(experimentalSettings.experimentalCallMute))

View File

@ -337,13 +337,13 @@ public struct PeerEmojiStatus: Equatable, Codable {
switch flatBuffersObject.valueType {
case .peeremojistatuscontentemoji:
guard let emoji = flatBuffersObject.value(type: TelegramCore_PeerEmojiStatusContentEmoji.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .emoji(fileId: emoji.fileId)
case .peeremojistatuscontentstargift:
guard let starGift = flatBuffersObject.value(type: TelegramCore_PeerEmojiStatusContentStarGift.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .starGift(
id: starGift.id,
@ -358,7 +358,7 @@ public struct PeerEmojiStatus: Equatable, Codable {
)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}

View File

@ -970,7 +970,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
switch flatBuffersObject.valueType {
case .telegrammediaresourceCloudfilemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudFileMediaResource.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return CloudFileMediaResource(
datacenterId: Int(value.datacenterId),
@ -982,7 +982,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceClouddocumentsizemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudDocumentSizeMediaResource.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return CloudDocumentSizeMediaResource(
datacenterId: value.datacenterId,
@ -993,7 +993,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceCloudphotosizemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return CloudPhotoSizeMediaResource(
datacenterId: value.datacenterId,
@ -1005,7 +1005,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceCloudpeerphotosizemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudPeerPhotoSizeMediaResource.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
let sizeSpec: CloudPeerPhotoSizeSpec
switch value.sizeSpec {
@ -1023,7 +1023,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceCloudstickerpackthumbnailmediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudStickerPackThumbnailMediaResource.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return CloudStickerPackThumbnailMediaResource(
datacenterId: value.datacenterId,
@ -1033,7 +1033,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceClouddocumentmediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudDocumentMediaResource.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return CloudDocumentMediaResource(
datacenterId: Int(value.datacenterId),
@ -1045,7 +1045,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceLocalfilemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_LocalFileMediaResource.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return LocalFileMediaResource(
fileId: value.fileId,
@ -1053,7 +1053,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
isSecretRelated: value.isSecretRelated
)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}

View File

@ -522,139 +522,139 @@ public indirect enum InstantPageBlock: PostboxCoding, Equatable {
self = .unsupported
case .instantpageblockTitle:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Title.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .title(try RichText(flatBuffersObject: value.text))
case .instantpageblockSubtitle:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Subtitle.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .subtitle(try RichText(flatBuffersObject: value.text))
case .instantpageblockAuthordate:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_AuthorDate.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .authorDate(author: try RichText(flatBuffersObject: value.author), date: value.date)
case .instantpageblockHeader:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Header.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .header(try RichText(flatBuffersObject: value.text))
case .instantpageblockSubheader:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Subheader.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .subheader(try RichText(flatBuffersObject: value.text))
case .instantpageblockParagraph:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Paragraph.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .paragraph(try RichText(flatBuffersObject: value.text))
case .instantpageblockPreformatted:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Preformatted.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .preformatted(try RichText(flatBuffersObject: value.text))
case .instantpageblockFooter:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Footer.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .footer(try RichText(flatBuffersObject: value.text))
case .instantpageblockDivider:
self = .divider
case .instantpageblockAnchor:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Anchor.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .anchor(value.name)
case .instantpageblockList:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_List.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .list(items: try (0 ..< value.itemsCount).map { try InstantPageListItem(flatBuffersObject: value.items(at: $0)!) }, ordered: value.ordered)
case .instantpageblockBlockquote:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_BlockQuote.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .blockQuote(text: try RichText(flatBuffersObject: value.text), caption: try RichText(flatBuffersObject: value.caption))
case .instantpageblockPullquote:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_PullQuote.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .pullQuote(text: try RichText(flatBuffersObject: value.text), caption: try RichText(flatBuffersObject: value.caption))
case .instantpageblockImage:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Image.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .image(id: MediaId(value.id), caption: try InstantPageCaption(flatBuffersObject: value.caption), url: value.url, webpageId: value.webpageId.flatMap(MediaId.init))
case .instantpageblockVideo:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Video.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .video(id: MediaId(value.id), caption: try InstantPageCaption(flatBuffersObject: value.caption), autoplay: value.autoplay, loop: value.loop)
case .instantpageblockAudio:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Audio.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .audio(id: MediaId(value.id), caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockCover:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Cover.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .cover(try InstantPageBlock(flatBuffersObject: value.block))
case .instantpageblockWebembed:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_WebEmbed.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .webEmbed(url: value.url, html: value.html, dimensions: value.dimensions.flatMap(PixelDimensions.init), caption: try InstantPageCaption(flatBuffersObject: value.caption), stretchToWidth: value.stretchToWidth, allowScrolling: value.allowScrolling, coverId: value.coverId.flatMap(MediaId.init))
case .instantpageblockPostembed:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_PostEmbed.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .postEmbed(url: value.url, webpageId: value.webpageId.flatMap(MediaId.init), avatarId: value.avatarId.flatMap(MediaId.init), author: value.author, date: value.date, blocks: try (0 ..< value.blocksCount).map { try InstantPageBlock(flatBuffersObject: value.blocks(at: $0)!) }, caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockCollage:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Collage.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .collage(items: try (0 ..< value.itemsCount).map { try InstantPageBlock(flatBuffersObject: value.items(at: $0)!) }, caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockSlideshow:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Slideshow.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .slideshow(items: try (0 ..< value.itemsCount).map { try InstantPageBlock(flatBuffersObject: value.items(at: $0)!) }, caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockChannelbanner:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_ChannelBanner.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
let channel = try value.channel.flatMap { try TelegramChannel(flatBuffersObject: $0) }
self = .channelBanner(channel)
case .instantpageblockKicker:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Kicker.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .kicker(try RichText(flatBuffersObject: value.text))
case .instantpageblockTable:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Table.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .table(title: try RichText(flatBuffersObject: value.title), rows: try (0 ..< value.rowsCount).map { try InstantPageTableRow(flatBuffersObject: value.rows(at: $0)!) }, bordered: value.bordered, striped: value.striped)
case .instantpageblockDetails:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Details.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .details(title: try RichText(flatBuffersObject: value.title), blocks: try (0 ..< value.blocksCount).map { try InstantPageBlock(flatBuffersObject: value.blocks(at: $0)!) }, expanded: value.expanded)
case .instantpageblockRelatedarticles:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_RelatedArticles.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .relatedArticles(title: try RichText(flatBuffersObject: value.title), articles: try (0 ..< value.articlesCount).map { try InstantPageRelatedArticle(flatBuffersObject: value.articles(at: $0)!) })
case .instantpageblockMap:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Map.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .map(latitude: value.latitude, longitude: value.longitude, zoom: value.zoom, dimensions: PixelDimensions(value.dimensions), caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}
@ -1023,13 +1023,13 @@ public indirect enum InstantPageListItem: PostboxCoding, Equatable {
switch flatBuffersObject.valueType {
case .instantpagelistitemText:
guard let textValue = flatBuffersObject.value(type: TelegramCore_InstantPageListItem_Text.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .text(try RichText(flatBuffersObject: textValue.text), textValue.number)
case .instantpagelistitemBlocks:
guard let blocksValue = flatBuffersObject.value(type: TelegramCore_InstantPageListItem_Blocks.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
let blocks = try (0 ..< blocksValue.blocksCount).map { i in
return try InstantPageBlock(flatBuffersObject: blocksValue.blocks(at: i)!)
@ -1038,7 +1038,7 @@ public indirect enum InstantPageListItem: PostboxCoding, Equatable {
case .instantpagelistitemUnknown:
self = .unknown
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}

View File

@ -79,7 +79,7 @@ public extension PartialMediaReference {
switch flatBuffersObject.valueType {
case .partialmediareferenceMessage:
guard let value = flatBuffersObject.value(type: TelegramCore_PartialMediaReference_Message.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
if let message = value.message {
self = .message(message: try MessageReference(flatBuffersObject: message))
@ -88,7 +88,7 @@ public extension PartialMediaReference {
}
case .partialmediareferenceWebpage:
guard let value = flatBuffersObject.value(type: TelegramCore_PartialMediaReference_WebPage.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
if let webPage = value.webPage {
self = .webPage(webPage: try WebpageReference(flatBuffersObject: webPage))
@ -97,7 +97,7 @@ public extension PartialMediaReference {
}
case .partialmediareferenceStickerpack:
guard let value = flatBuffersObject.value(type: TelegramCore_PartialMediaReference_StickerPack.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .stickerPack(stickerPack: try StickerPackReference(flatBuffersObject: value.stickerPack))
case .partialmediareferenceSavedgif:
@ -107,7 +107,7 @@ public extension PartialMediaReference {
case .partialmediareferenceRecentsticker:
self = .recentSticker
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}

View File

@ -19,16 +19,16 @@ public enum TelegramPeerAccessHash: Hashable {
switch flatBuffersObject.valueType {
case .telegrampeeraccesshashPersonal:
guard let personal = flatBuffersObject.value(type: TelegramCore_TelegramPeerAccessHash_Personal.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .personal(personal.accessHash)
case .telegrampeeraccesshashGenericpublic:
guard let genericPublic = flatBuffersObject.value(type: TelegramCore_TelegramPeerAccessHash_GenericPublic.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .genericPublic(genericPublic.accessHash)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}

View File

@ -80,21 +80,21 @@ public enum PeerReference: PostboxCoding, Hashable, Equatable {
switch flatBuffersObject.valueType {
case .peerreferenceUser:
guard let value = flatBuffersObject.value(type: TelegramCore_PeerReference_User.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .user(id: value.id, accessHash: value.accessHash)
case .peerreferenceGroup:
guard let value = flatBuffersObject.value(type: TelegramCore_PeerReference_Group.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .group(id: value.id)
case .peerreferenceChannel:
guard let value = flatBuffersObject.value(type: TelegramCore_PeerReference_Channel.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .channel(id: value.id, accessHash: value.accessHash)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}

View File

@ -302,79 +302,79 @@ extension RichText {
self = .empty
case .richtextPlain:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Plain.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .plain(value.text)
case .richtextBold:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Bold.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .bold(try RichText(flatBuffersObject: value.text))
case .richtextItalic:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Italic.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .italic(try RichText(flatBuffersObject: value.text))
case .richtextUnderline:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Underline.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .underline(try RichText(flatBuffersObject: value.text))
case .richtextStrikethrough:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Strikethrough.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .strikethrough(try RichText(flatBuffersObject: value.text))
case .richtextFixed:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Fixed.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .fixed(try RichText(flatBuffersObject: value.text))
case .richtextUrl:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Url.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .url(text: try RichText(flatBuffersObject: value.text), url: value.url, webpageId: value.webpageId.flatMap { MediaId($0) })
case .richtextEmail:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Email.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .email(text: try RichText(flatBuffersObject: value.text),
email: value.email)
case .richtextConcat:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Concat.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .concat(try (0..<value.textsCount).map { try RichText(flatBuffersObject: value.texts(at: $0)!) })
case .richtextSubscript:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Subscript.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .subscript(try RichText(flatBuffersObject: value.text))
case .richtextSuperscript:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Superscript.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .superscript(try RichText(flatBuffersObject: value.text))
case .richtextMarked:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Marked.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .marked(try RichText(flatBuffersObject: value.text))
case .richtextPhone:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Phone.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .phone(text: try RichText(flatBuffersObject: value.text),
phone: value.phone)
case .richtextImage:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Image.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .image(id: MediaId(value.id), dimensions: PixelDimensions(value.dimensions))
case .richtextAnchor:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Anchor.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .anchor(text: try RichText(flatBuffersObject: value.text),
name: value.name)

View File

@ -121,16 +121,16 @@ public enum TelegramChannelInfo: Equatable {
switch flatBuffersObject.valueType {
case .telegramchannelinfoBroadcast:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramChannelInfo_Broadcast.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .broadcast(TelegramChannelBroadcastInfo(flags: TelegramChannelBroadcastFlags(rawValue: value.flags)))
case .telegramchannelinfoGroup:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramChannelInfo_Group.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .group(TelegramChannelGroupInfo(flags: TelegramChannelGroupFlags(rawValue: value.flags)))
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}
@ -599,7 +599,7 @@ public final class TelegramChannel: Peer, Equatable {
self.participationStatus = TelegramChannelParticipationStatus(rawValue: flatBuffersObject.participationStatus)
guard let infoObj = flatBuffersObject.info else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self.info = try TelegramChannelInfo(flatBuffersObject: infoObj)

View File

@ -47,18 +47,18 @@ public enum TelegramGroupRole: Equatable, PostboxCoding {
switch flatBuffersObject.valueType {
case .telegramgrouproleCreator:
guard let creator = flatBuffersObject.value(type: TelegramCore_TelegramGroupRole_Creator.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .creator(rank: creator.rank)
case .telegramgrouproleAdmin:
guard let admin = flatBuffersObject.value(type: TelegramCore_TelegramGroupRole_Admin.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .admin(try TelegramChatAdminRights(flatBuffersObject: admin.rights), rank: admin.rank)
case .telegramgrouproleMember:
self = .member
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}
@ -250,7 +250,7 @@ public final class TelegramGroup: Peer, Equatable {
self.participantCount = Int(flatBuffersObject.participantCount)
guard let role = flatBuffersObject.role else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self.role = try TelegramGroupRole(flatBuffersObject: role)

View File

@ -126,19 +126,19 @@ public enum StickerPackReference: PostboxCoding, Hashable, Equatable, Codable {
switch flatBuffersObject.valueType {
case .stickerpackreferenceId:
guard let value = flatBuffersObject.value(type: TelegramCore_StickerPackReference_Id.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .id(id: value.id, accessHash: value.accessHash)
case .stickerpackreferenceName:
guard let value = flatBuffersObject.value(type: TelegramCore_StickerPackReference_Name.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .name(value.name)
case .stickerpackreferenceAnimatedemoji:
self = .animatedEmoji
case .stickerpackreferenceDice:
guard let value = flatBuffersObject.value(type: TelegramCore_StickerPackReference_Dice.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .dice(value.emoji)
case .stickerpackreferenceAnimatedemojianimations:
@ -154,7 +154,7 @@ public enum StickerPackReference: PostboxCoding, Hashable, Equatable, Codable {
case .stickerpackreferenceIconchannelstatusemoji:
self = .iconChannelStatusEmoji
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}
@ -478,29 +478,29 @@ public enum TelegramMediaFileAttribute: PostboxCoding, Equatable {
switch flatBuffersObject.valueType {
case .telegrammediafileattributeFilename:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_FileName.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .FileName(fileName: value.fileName)
case .telegrammediafileattributeSticker:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_Sticker.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .Sticker(displayText: value.displayText, packReference: try value.packReference.flatMap({ try StickerPackReference(flatBuffersObject: $0) }), maskData: value.maskData.flatMap({ StickerMaskCoords(flatBuffersObject: $0) }))
case .telegrammediafileattributeImagesize:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_ImageSize.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .ImageSize(size: PixelDimensions(width: value.width, height: value.height))
case .telegrammediafileattributeAnimated:
self = .Animated
case .telegrammediafileattributeVideo:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_Video.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .Video(duration: Double(value.duration), size: PixelDimensions(width: value.width, height: value.height), flags: TelegramMediaVideoFlags(rawValue: value.flags), preloadSize: value.preloadSize == 0 ? nil : value.preloadSize, coverTime: value.coverTime == 0.0 ? nil : Double(value.coverTime), videoCodec: value.videoCodec)
case .telegrammediafileattributeAudio:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_Audio.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .Audio(isVoice: value.isVoice, duration: Int(value.duration), title: value.title, performer: value.performer, waveform: value.waveform.isEmpty ? nil : Data(value.waveform))
case .telegrammediafileattributeHaslinkedstickers:
@ -512,10 +512,10 @@ public enum TelegramMediaFileAttribute: PostboxCoding, Equatable {
case .telegrammediafileattributeNopremium:
self = .NoPremium
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
case .telegrammediafileattributeCustomemoji:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_CustomEmoji.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self = .CustomEmoji(isPremium: value.isPremium, isSingleColor: value.isSingleColor, alt: value.alt, packReference: try value.packReference.flatMap({ try StickerPackReference(flatBuffersObject: $0) }))
}

View File

@ -219,16 +219,16 @@ public final class TelegramMediaImage: Media, Equatable, Codable {
switch flatBuffersObject.contentType {
case .emojimarkupContentEmoji:
guard let value = flatBuffersObject.content(type: TelegramCore_EmojiMarkup_Content_Emoji.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self.content = .emoji(fileId: value.fileId)
case .emojimarkupContentSticker:
guard let value = flatBuffersObject.content(type: TelegramCore_EmojiMarkup_Content_Sticker.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self.content = .sticker(packReference: try StickerPackReference(flatBuffersObject: value.packReference), fileId: value.fileId)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
self.backgroundColors = flatBuffersObject.backgroundColors

View File

@ -3,24 +3,36 @@ import FlatBuffers
import FlatSerialization
import Postbox
#if DEBUG && false
#if DEBUG
public var flatBuffers_checkedGet: Bool = true
#else
public var flatBuffers_checkedGet: Bool = false
#endif
@inline(__always)
public func FlatBuffers_getRoot<T: FlatBufferObject & Verifiable>(
byteBuffer: inout ByteBuffer,
fileId: String? = nil,
options: VerifierOptions = .init()
) -> T {
return try! getCheckedRoot(byteBuffer: &byteBuffer, fileId: fileId, options: options)
if flatBuffers_checkedGet {
return getRoot(byteBuffer: &byteBuffer)
} else {
return try! getCheckedRoot(byteBuffer: &byteBuffer, fileId: fileId, options: options)
}
}
#else
@inline(__always)
public func FlatBuffers_getRoot<T: FlatBufferObject>(byteBuffer: inout ByteBuffer) -> T {
return getRoot(byteBuffer: &byteBuffer)
}
#endif
public enum FlatBuffersError: Error {
case missingRequiredField(file: String, line: Int)
case value_missingRequiredField(file: String, line: Int)
case invalidUnionType
public static func missingRequiredField(file: String = #file, line: Int = #line) -> FlatBuffersError {
if flatBuffers_checkedGet {
preconditionFailure()
}
return .value_missingRequiredField(file: file, line: line)
}
}
public extension PeerId {

View File

@ -8,16 +8,16 @@ public func TelegramMedia_parse(flatBuffersObject: TelegramCore_Media) throws ->
switch flatBuffersObject.valueType {
case .mediaTelegrammediafile:
guard let value = flatBuffersObject.value(type: TelegramCore_Media_TelegramMediaFile.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return try TelegramMediaFile(flatBuffersObject: value.file)
case .mediaTelegrammediaimage:
guard let value = flatBuffersObject.value(type: TelegramCore_Media_TelegramMediaImage.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
return try TelegramMediaImage(flatBuffersObject: value.image)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
throw FlatBuffersError.missingRequiredField()
}
}

View File

@ -65,6 +65,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
public var devRequests: Bool
public var fakeAds: Bool
public var conferenceDebug: Bool
public var checkSerializedData: Bool
public static var defaultSettings: ExperimentalUISettings {
return ExperimentalUISettings(
@ -107,7 +108,8 @@ public struct ExperimentalUISettings: Codable, Equatable {
playerV2: false,
devRequests: false,
fakeAds: false,
conferenceDebug: false
conferenceDebug: false,
checkSerializedData: false
)
}
@ -151,7 +153,8 @@ public struct ExperimentalUISettings: Codable, Equatable {
playerV2: Bool,
devRequests: Bool,
fakeAds: Bool,
conferenceDebug: Bool
conferenceDebug: Bool,
checkSerializedData: Bool
) {
self.keepChatNavigationStack = keepChatNavigationStack
self.skipReadHistory = skipReadHistory
@ -193,6 +196,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
self.devRequests = devRequests
self.fakeAds = fakeAds
self.conferenceDebug = conferenceDebug
self.checkSerializedData = checkSerializedData
}
public init(from decoder: Decoder) throws {
@ -238,6 +242,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
self.devRequests = try container.decodeIfPresent(Bool.self, forKey: "devRequests") ?? false
self.fakeAds = try container.decodeIfPresent(Bool.self, forKey: "fakeAds") ?? false
self.conferenceDebug = try container.decodeIfPresent(Bool.self, forKey: "conferenceDebug") ?? false
self.checkSerializedData = try container.decodeIfPresent(Bool.self, forKey: "checkSerializedData") ?? false
}
public func encode(to encoder: Encoder) throws {
@ -283,6 +288,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
try container.encodeIfPresent(self.devRequests, forKey: "devRequests")
try container.encodeIfPresent(self.fakeAds, forKey: "fakeAds")
try container.encodeIfPresent(self.conferenceDebug, forKey: "conferenceDebug")
try container.encodeIfPresent(self.checkSerializedData, forKey: "checkSerializedData")
}
}