mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-02-12 03:41:38 +00:00
Some checks failed
Build and Release / Read metadata (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-apple-darwin, osx-arm64, macos-latest, aarch64-apple-darwin, dmg updater) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-pc-windows-msvc.exe, win-arm64, windows-latest, aarch64-pc-windows-msvc, nsis updater) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-unknown-linux-gnu, linux-arm64, ubuntu-22.04-arm, aarch64-unknown-linux-gnu, appimage deb updater) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-apple-darwin, osx-x64, macos-latest, x86_64-apple-darwin, dmg updater) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-pc-windows-msvc.exe, win-x64, windows-latest, x86_64-pc-windows-msvc, nsis updater) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-unknown-linux-gnu, linux-x64, ubuntu-22.04, x86_64-unknown-linux-gnu, appimage deb updater) (push) Has been cancelled
Build and Release / Prepare & create release (push) Has been cancelled
Build and Release / Publish release (push) Has been cancelled
71 lines
3.0 KiB
C#
71 lines
3.0 KiB
C#
using AIStudio.Tools.Rust;
|
|
|
|
namespace AIStudio.Chat;
|
|
|
|
/// <summary>
|
|
/// Represents an immutable file attachment with details about its type, name, path, and size.
|
|
/// </summary>
|
|
/// <param name="Type">The type of the file attachment.</param>
|
|
/// <param name="FileName">The name of the file, including extension.</param>
|
|
/// <param name="FilePath">The full path to the file, including the filename and extension.</param>
|
|
/// <param name="FileSizeBytes">The size of the file in bytes.</param>
|
|
public readonly record struct FileAttachment(FileAttachmentType Type, string FileName, string FilePath, long FileSizeBytes)
|
|
{
|
|
/// <summary>
|
|
/// Gets a value indicating whether the file still exists on the file system.
|
|
/// </summary>
|
|
public bool Exists => File.Exists(this.FilePath);
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether the file type is forbidden and should not be attached.
|
|
/// </summary>
|
|
public bool IsForbidden => this.Type == FileAttachmentType.FORBIDDEN;
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether the file type is valid and allowed to be attached.
|
|
/// </summary>
|
|
public bool IsValid => this.Type != FileAttachmentType.FORBIDDEN;
|
|
|
|
/// <summary>
|
|
/// Creates a FileAttachment from a file path by automatically determining the type,
|
|
/// extracting the filename, and reading the file size.
|
|
/// </summary>
|
|
/// <param name="filePath">The full path to the file.</param>
|
|
/// <returns>A FileAttachment instance with populated properties.</returns>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Determines the file attachment type based on the file extension.
|
|
/// Uses centrally defined file type filters from <see cref="FileTypeFilter"/>.
|
|
/// </summary>
|
|
/// <param name="filePath">The file path to analyze.</param>
|
|
/// <returns>The corresponding FileAttachmentType.</returns>
|
|
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;
|
|
}
|
|
} |