HuggingChat-Mac/Models/MessageRow.swift (77 lines of code) (raw):
//
// MessageRow.swift
// HuggingChat-Mac
//
// Created by Cyril Zakka on 8/29/24.
//
import Foundation
struct AttributedOutput {
let string: String
let results: [ParserResult]
}
enum MessageRowType {
case attributed(AttributedOutput)
case rawText(String)
var text: String {
switch self {
case .attributed(let attributedOutput):
return attributedOutput.string
case .rawText(let string):
return string
}
}
}
enum MessageType: CustomStringConvertible {
var description: String {
switch self {
case .user:
return "user"
case .assistant:
return "assistant"
}
}
case user
case assistant
}
final class MessageRow: Identifiable, PromptRequestConvertible {
private(set) var id = UUID().uuidString.lowercased()
let type: MessageType
var isInteracting: Bool
var content: String {
contentType.text
}
var contentType: MessageRowType
var responseError: String?
var prompt: String {
return content
}
var webSearch: WebSearch?
var fileInfo: FileMessage?
init?(message: Message) {
self.id = message.id
switch message.author {
case .assistant:
self.type = .assistant
case .user:
self.type = .user
default:
return nil
}
self.isInteracting = false
self.contentType = .rawText(message.content)
self.responseError = nil
self.fileInfo = nil
if let webSearch = message.webSearch {
self.webSearch = WebSearch(message: "Completed", sources: webSearch.contextSources)
}
}
init(id: String = UUID().uuidString.lowercased(), type: MessageType, isInteracting: Bool, contentType: MessageRowType, responseError: String? = nil, fileInfo: FileMessage? = nil) {
self.id = id
self.type = type
self.isInteracting = isInteracting
self.contentType = contentType
self.responseError = responseError
self.fileInfo = fileInfo
}
func updateID(message: Message) {
self.id = message.id
}
}
protocol PromptRequestConvertible {
var id: String { get }
var prompt: String { get }
}