metatext/Model/Status.swift
Justin Mazzocchi 725438cc9e
Filtering
2020-08-29 22:31:30 -07:00

187 lines
5.6 KiB
Swift

// Copyright © 2020 Metabolist. All rights reserved.
import Foundation
class Status: Codable, Identifiable {
enum Visibility: String, Codable, Unknowable {
case `public`
case unlisted
case `private`
case direct
case unknown
static var unknownCase: Self { .unknown }
}
let id: String
let uri: String
let createdAt: Date
let account: Account
let content: HTML
let visibility: Visibility
let sensitive: Bool
let spoilerText: String
let mediaAttachments: [Attachment]
let mentions: [Mention]
let tags: [Tag]
let emojis: [Emoji]
let reblogsCount: Int
let favouritesCount: Int
@DecodableDefault.Zero private(set) var repliesCount: Int
let application: Application?
let url: URL?
let inReplyToId: String?
let inReplyToAccountId: String?
let reblog: Status?
let poll: Poll?
let card: Card?
let language: String?
let text: String?
@DecodableDefault.False private(set) var favourited: Bool
@DecodableDefault.False private(set) var reblogged: Bool
@DecodableDefault.False private(set) var muted: Bool
@DecodableDefault.False private(set) var bookmarked: Bool
let pinned: Bool?
// Xcode-generated memberwise initializer
init(
id: String,
uri: String,
createdAt: Date,
account: Account,
content: HTML,
visibility: Status.Visibility,
sensitive: Bool,
spoilerText: String,
mediaAttachments: [Attachment],
mentions: [Mention],
tags: [Tag],
emojis: [Emoji],
reblogsCount: Int,
favouritesCount: Int,
repliesCount: Int,
application: Application?,
url: URL?,
inReplyToId: String?,
inReplyToAccountId: String?,
reblog: Status?,
poll: Poll?,
card: Card?,
language: String?,
text: String?,
favourited: Bool,
reblogged: Bool,
muted: Bool,
bookmarked: Bool,
pinned: Bool?) {
self.id = id
self.uri = uri
self.createdAt = createdAt
self.account = account
self.content = content
self.visibility = visibility
self.sensitive = sensitive
self.spoilerText = spoilerText
self.mediaAttachments = mediaAttachments
self.mentions = mentions
self.tags = tags
self.emojis = emojis
self.reblogsCount = reblogsCount
self.favouritesCount = favouritesCount
self.repliesCount = repliesCount
self.application = application
self.url = url
self.inReplyToId = inReplyToId
self.inReplyToAccountId = inReplyToAccountId
self.reblog = reblog
self.poll = poll
self.card = card
self.language = language
self.text = text
self.favourited = favourited
self.reblogged = reblogged
self.muted = muted
self.bookmarked = bookmarked
self.pinned = pinned
}
}
extension Status {
var displayStatus: Status {
reblog ?? self
}
var filterableContent: String {
[content.attributed.string,
spoilerText,
(poll?.options.map(\.title) ?? []).joined(separator: " "),
reblog?.filterableContent ?? ""]
.joined(separator: " ")
}
}
extension Status: Hashable {
static func == (lhs: Status, rhs: Status) -> Bool {
lhs.id == rhs.id
&& lhs.uri == rhs.uri
&& lhs.createdAt == rhs.createdAt
&& lhs.account == rhs.account
&& lhs.content == rhs.content
&& lhs.visibility == rhs.visibility
&& lhs.sensitive == rhs.sensitive
&& lhs.spoilerText == rhs.spoilerText
&& lhs.mediaAttachments == rhs.mediaAttachments
&& lhs.mentions == rhs.mentions
&& lhs.tags == rhs.tags
&& lhs.emojis == rhs.emojis
&& lhs.reblogsCount == rhs.reblogsCount
&& lhs.favouritesCount == rhs.favouritesCount
&& lhs.repliesCount == rhs.repliesCount
&& lhs.application == rhs.application
&& lhs.url == rhs.url
&& lhs.inReplyToId == rhs.inReplyToId
&& lhs.inReplyToAccountId == rhs.inReplyToAccountId
&& lhs.reblog == rhs.reblog
&& lhs.poll == rhs.poll
&& lhs.card == rhs.card
&& lhs.language == rhs.language
&& lhs.text == rhs.text
&& lhs.favourited == rhs.favourited
&& lhs.reblogged == rhs.reblogged
&& lhs.muted == rhs.muted
&& lhs.bookmarked == rhs.bookmarked
&& lhs.pinned == rhs.pinned
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
hasher.combine(uri)
hasher.combine(createdAt)
hasher.combine(account)
hasher.combine(content)
hasher.combine(visibility)
hasher.combine(sensitive)
hasher.combine(spoilerText)
hasher.combine(mediaAttachments)
hasher.combine(mentions)
hasher.combine(tags)
hasher.combine(emojis)
hasher.combine(reblogsCount)
hasher.combine(favouritesCount)
hasher.combine(repliesCount)
hasher.combine(application)
hasher.combine(url)
hasher.combine(inReplyToId)
hasher.combine(inReplyToAccountId)
hasher.combine(reblog)
hasher.combine(poll)
hasher.combine(card)
hasher.combine(language)
hasher.combine(text)
hasher.combine(favourited)
hasher.combine(reblogged)
hasher.combine(muted)
hasher.combine(bookmarked)
hasher.combine(pinned)
}
}