public extension RantFeed {
    /// Contains information about news given in rant feeds.
    /// - note: This is mostly used for weekly group rants.
    struct News: Hashable, Identifiable, Sendable {
        public enum Action: String, Sendable {
            case groupRant = "grouprant"
            case none = "none"
            case rant = "rant"
        }
        
        public let id: Int
        
        /// Most of the time this is equal to the value `intlink`, this specifies the type of news.
        /// This should be an enum but it's unknown what the other values are and weekly news are dead anyway.
        public let type: String
        
        /// The headline text of the news.
        public let headlineText: String
        
        /// The contents of the news.
        public let text: String
        
        /// The footer text of the news.
        public let footerText: String
        
        /// The height of the news view on the screen.
        public let height: Int
        
        /// The action that should be performed when the user taps/clicks on the news.
        public let action: Action
        
        public init(id: Int, type: String, headlineText: String, text: String, footerText: String, height: Int, action: Action) {
            self.id = id
            self.type = type
            self.headlineText = headlineText
            self.text = text
            self.footerText = footerText
            self.height = height
            self.action = action
        }
    }
}

extension RantFeed.News {
    struct CodingData: Codable {
        let id: Int
        let type: String
        let headline: String
        let body: String?
        let footer: String
        let height: Int
        let action: String
    }
}

extension RantFeed.News.CodingData {
    var decoded: RantFeed.News {
        .init(
            id: id,
            type: type,
            headlineText: headline,
            text: body ?? "",
            footerText: footer,
            height: height,
            action: .init(rawValue: action) ?? .none
        )
    }
}