using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Rust; namespace AIStudio.Tools.Validation; /// /// Provides centralized validation for file extensions. /// public static class FileExtensionValidation { private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(FileExtensionValidation).Namespace, nameof(FileExtensionValidation)); /// /// Validates the file extension and sends appropriate MessageBus notifications when invalid. /// /// The file path to validate. /// True if valid, false if invalid (error/warning already sent via MessageBus). public static async Task IsExtensionValidWithNotifyAsync(string filePath) { var ext = Path.GetExtension(filePath).TrimStart('.'); if (Array.Exists(FileTypeFilter.Executables.FilterExtensions, x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.AppBlocking, TB("Executables are not allowed"))); return false; } if (Array.Exists(FileTypeFilter.AllImages.FilterExtensions, x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.ImageNotSupported, TB("Images are not supported yet"))); return false; } if (Array.Exists(FileTypeFilter.AllVideos.FilterExtensions, x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.FeaturedVideo, TB("Videos are not supported yet"))); return false; } if (Array.Exists(FileTypeFilter.AllAudio.FilterExtensions, x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.AudioFile, TB("Audio files are not supported yet"))); return false; } return true; } /// /// Validates that the file is a supported image format and sends appropriate MessageBus notifications when invalid. /// /// The file path to validate. /// True if valid image, false if invalid (error already sent via MessageBus). public static async Task IsImageExtensionValidWithNotifyAsync(string filePath) { var ext = Path.GetExtension(filePath).TrimStart('.'); if (string.IsNullOrWhiteSpace(ext)) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.ImageNotSupported, TB("File has no extension"))); return false; } if (!Array.Exists(FileTypeFilter.AllImages.FilterExtensions, x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.ImageNotSupported, TB("Unsupported image format"))); return false; } return true; } }