70 lines
1.7 KiB
Swift
70 lines
1.7 KiB
Swift
import Foundation
|
|
|
|
enum IngestedSourceKind: String, Codable, Sendable, CaseIterable {
|
|
case text
|
|
case pdf
|
|
case file
|
|
|
|
var label: String {
|
|
switch self {
|
|
case .text: "Text"
|
|
case .pdf: "PDF"
|
|
case .file: "File"
|
|
}
|
|
}
|
|
}
|
|
|
|
struct IngestedSource: Identifiable, Codable, Sendable, Hashable {
|
|
let id: UUID
|
|
var kind: IngestedSourceKind
|
|
var title: String
|
|
var bodyText: String
|
|
var originalFilename: String?
|
|
var localFilename: String?
|
|
var tags: [String]
|
|
var createdAt: Date
|
|
var modifiedAt: Date
|
|
|
|
init(
|
|
id: UUID = UUID(),
|
|
kind: IngestedSourceKind,
|
|
title: String,
|
|
bodyText: String,
|
|
originalFilename: String? = nil,
|
|
localFilename: String? = nil,
|
|
tags: [String] = [],
|
|
createdAt: Date = Date(),
|
|
modifiedAt: Date = Date()
|
|
) {
|
|
self.id = id
|
|
self.kind = kind
|
|
self.title = title
|
|
self.bodyText = bodyText
|
|
self.originalFilename = originalFilename
|
|
self.localFilename = localFilename
|
|
self.tags = tags
|
|
self.createdAt = createdAt
|
|
self.modifiedAt = modifiedAt
|
|
}
|
|
|
|
var displayTitle: String {
|
|
let trimmed = title.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
if !trimmed.isEmpty { return trimmed }
|
|
return originalFilename ?? kind.label
|
|
}
|
|
|
|
var excerpt: String {
|
|
bodyText
|
|
.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
.replacingOccurrences(of: "\n", with: " ")
|
|
}
|
|
|
|
var podcastURL: String {
|
|
"marks-source://\(id.uuidString)"
|
|
}
|
|
|
|
var podcastText: String {
|
|
String(bodyText.trimmingCharacters(in: .whitespacesAndNewlines).prefix(100_000))
|
|
}
|
|
}
|