using System; using System.Collections.Generic; using FluentValidation; using MfGames.Gallium; using MfGames.Nitride.Contents; using Zio; namespace MfGames.Nitride.Markdown; /// /// An operation that identifies Markdown files by their common extensions /// and converts them to text input while also adding the IsMarkdown /// component to identify them. /// [WithProperties] public partial class IdentifyMarkdown : IOperation { private readonly IValidator validator; public IdentifyMarkdown(IValidator validator) { this.validator = validator; } public Func IsMarkdownTest { get; set; } = null!; /// public IEnumerable Run(IEnumerable input) { this.validator.ValidateAndThrow(this); return input.SelectEntity(this.MarkTextEntities) .SelectEntity(this.MarkBinaryEntities); } private Entity MarkBinaryEntities( Entity entity, UPath path, IBinaryContent binary) { // If we aren't a Markdown file, then there is nothing we can do about that. if (!this.IsMarkdownTest(entity, path)) { return entity; } // Convert the file as a binary. if (binary is ITextContentConvertable textConvertable) { entity = entity.SetTextContent(textConvertable.ToTextContent()) .Set(IsMarkdown.Instance); } else { throw new InvalidOperationException( "Cannot convert a binary content to a text without ITextContentConvertable."); } return entity; } private Entity MarkTextEntities( Entity entity, UPath path, ITextContent _) { // If we aren't a Markdown file, then there is nothing // we can do about that. if (!this.IsMarkdownTest(entity, path)) { return entity; } // We are already text, so just mark it as Markdown. entity = entity.Set(IsMarkdown.Instance); return entity; } }