{ "extension": ".swift", "source": "public extension NotificationFeed {\n /// Holds numbers of unread notifications for each type of notification.\n struct UnreadNumbers: Decodable, Hashable, Sendable {\n /// The total number of unread notifications\n public let all: Int\n \n /// The number of unread commets.\n public let comments: Int\n \n /// The number of unread mentions.\n public let mentions: Int\n \n /// The number of unread rants from users which the logged in user is subscribed to.\n public let subscriptions: Int\n \n /// The number of unread upvotes.\n public let upvotes: Int\n \n public init(all: Int, comments: Int, mentions: Int, subscriptions: Int, upvotes: Int) {\n self.all = all\n self.comments = comments\n self.mentions = mentions\n self.subscriptions = subscriptions\n self.upvotes = upvotes\n }\n }\n}\n\nextension NotificationFeed.UnreadNumbers {\n struct CodingData: Codable {\n let all: Int\n let comments: Int\n let mentions: Int\n let subs: Int\n let upvotes: Int\n //let total: Int //Not needed because it's the same as all.\n }\n}\n\nextension NotificationFeed.UnreadNumbers.CodingData {\n var decoded: NotificationFeed.UnreadNumbers {\n .init(\n all: all,\n comments: comments,\n mentions: mentions,\n subscriptions: subs,\n upvotes: upvotes\n )\n }\n}\n", "review": "Grade: 8\n\n### Bugs\n- There are no explicit bugs in the given code. However, it is important to ensure data integrity between CodingData and UnreadNumbers.\n\n### Optimizations\n- The CodingData structure could implement a custom initializer that ensures that all in UnreadNumbers is equal to the sum of other properties if that is a business requirement.\n- Consider renaming the subs property in CodingData to subscriptions to keep consistency across structures.\n\n### Good points\n- The code is well-structured, with appropriately named components.\n- The use of Decodable, Hashable, and Sendable protocols enhances the versatility and functionality of the UnreadNumbers struct.\n- Consistent use of access control modifiers (public) for properties and initializers where necessary.\n- Efficient transformation from CodingData to UnreadNumbers using the decoded computed property.\n\n### Summary\nThe code snippet provides a well-crafted extension of a NotificationFeed class to manage unread notifications efficiently. It is well-structured, establishing clear separation of concerns particularly through the use of Codable structures for decoding and ensuring compatibility with concurrency through the Sendable protocol. Minor consistency improvements with property naming and initializing could enhance the code's robustness and readability further.\n\n### Open source alternatives\n- Rocket.Chat provides notification features that can be extended or used as a reference.\n- Mattermost also deals with notifications and could provide additional perspective on handling unread notification counts effectively.", "filename": "NotificationFeed.UnreadNumbers.swift", "path": "Sources/SwiftDevRant/Models/NotificationFeed.UnreadNumbers.swift", "directory": "Models", "grade": 8, "size": 1511, "line_count": 51 }