/// A URL or a user mention link in a rant or comment.
public struct Link: Hashable, Sendable {
public enum Kind: String, Sendable {
case url = "url"
case userMention = "mention"
}
public let kind: Kind
/// The full URL.
public let url: String
/// No idea what this is and what it is supposed to be used for.
public let shortURL: String?
/// The url as it is visible in the text of the rant or comment.
public let title: String
/// The starting position of the link in the overall text of the rant or comment.
/// - Important: The devRant API returns offsets for links in byte offsets and not in normalized character offsets. Please take this into account when using these offsets.
public let start: Int?
/// The ending position of the link in the overall text of the rant or comment.
/// - Important: The devRant API returns offsets for links in byte offsets and not in normalized character offsets. Please take this into account when using these offsets.
public let end: Int?
public init(kind: Link.Kind, url: String, shortURL: String?, title: String, start: Int?, end: Int?) {
self.kind = kind
self.url = url
self.shortURL = shortURL
self.title = title
self.start = start
self.end = end
}
}
extension Link {
struct CodingData: Codable {
let type: String
let url: String
let short_url: String
let title: String
let start: Int?
let end: Int?
}
}
extension Link.CodingData {
var decoded: Link {
.init(
kind: .init(rawValue: type) ?? .url,
url: url,
shortURL: short_url,
title: title,
start: start,
end: end
)
}
}