namespace AIStudio.Tools; /// /// The result of reading a file through the Rust runtime. /// /// /// Content and failure travel together on purpose. When reading a file returns a bare string, a /// failed extraction is indistinguishable from an empty document, and the empty document reaches /// the AI as if that were the content of the user's file. /// /// How the extraction ended. /// The extracted content. Empty when the extraction failed. /// Why the extraction failed or lost parts of the file. /// The technical failure description, meant for logs and diagnostics. /// The pages which could not be read, when known. public readonly record struct FileExtractionResult(FileExtractionOutcome Outcome, string Content, FileExtractionErrorCode ErrorCode, string? ErrorMessage, IReadOnlyList FailedPages) { private static readonly int[] NO_FAILED_PAGES = []; public static FileExtractionResult Success(string content) => new(FileExtractionOutcome.SUCCESS, content, FileExtractionErrorCode.NONE, null, NO_FAILED_PAGES); public static FileExtractionResult Partial(string content, IReadOnlyList failedPages) => new(FileExtractionOutcome.PARTIAL, content, FileExtractionErrorCode.PAGE_EXTRACTION_FAILED, null, failedPages); public static FileExtractionResult Failed(FileExtractionErrorCode errorCode, string? errorMessage) => new(FileExtractionOutcome.FAILED, string.Empty, errorCode, errorMessage, NO_FAILED_PAGES); /// /// Gets a value indicating whether the whole file was read. /// public bool IsSuccess => this.Outcome is FileExtractionOutcome.SUCCESS; /// /// Gets a value indicating whether the content may be handed to the AI, i.e. the extraction /// either succeeded or lost only parts of the file. /// public bool HasUsableContent => this.Outcome is FileExtractionOutcome.SUCCESS or FileExtractionOutcome.PARTIAL; }