diff --git a/app/MindWork AI Studio/Chat/FileAttachment.cs b/app/MindWork AI Studio/Chat/FileAttachment.cs index 5b14f2e6..7f70ace3 100644 --- a/app/MindWork AI Studio/Chat/FileAttachment.cs +++ b/app/MindWork AI Studio/Chat/FileAttachment.cs @@ -1,6 +1,57 @@ +using AIStudio.Tools.Rust; + namespace AIStudio.Chat; /// /// Represents an immutable file attachment with details about its type, name, path, and size. /// -public readonly record struct FileAttachment(FileAttachmentType Type, string FileName, string FilePath, long FileSize); \ No newline at end of file +public readonly record struct FileAttachment(FileAttachmentType Type, string FileName, string FilePath, long FileSizeBytes) +{ + /// + /// Gets a value indicating whether the file still exists on the file system.` + /// + public bool Exists => File.Exists(this.FilePath); + + /// + /// Creates a FileAttachment from a file path by automatically determining the type, + /// extracting the filename, and reading the file size. + /// + /// The full path to the file. + /// A FileAttachment instance with populated properties. + public static FileAttachment FromPath(string filePath) + { + var fileName = Path.GetFileName(filePath); + var fileSize = File.Exists(filePath) ? new FileInfo(filePath).Length : 0; + var type = DetermineFileType(filePath); + + return new FileAttachment(type, fileName, filePath, fileSize); + } + + /// + /// Determines the file attachment type based on the file extension. + /// Uses centrally defined file type filters from . + /// + /// The file path to analyze. + /// The corresponding FileAttachmentType. + private static FileAttachmentType DetermineFileType(string filePath) + { + var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); + + // Check if it's an image file: + if (FileTypeFilter.AllImages.FilterExtensions.Contains(extension)) + return FileAttachmentType.IMAGE; + + // Check if it's an audio file: + if (FileTypeFilter.AllAudio.FilterExtensions.Contains(extension)) + return FileAttachmentType.AUDIO; + + // Check if it's an allowed document file (PDF, Text, or Office): + if (FileTypeFilter.PDF.FilterExtensions.Contains(extension) || + FileTypeFilter.Text.FilterExtensions.Contains(extension) || + FileTypeFilter.AllOffice.FilterExtensions.Contains(extension)) + return FileAttachmentType.DOCUMENT; + + // All other file types are forbidden: + return FileAttachmentType.FORBIDDEN; + } +} \ No newline at end of file