using System.Diagnostics.CodeAnalysis; namespace Pdftract; /// /// Base exception for all pdftract errors. /// public abstract class PdftractException : Exception { /// /// The exit code from the pdftract binary. /// public int ExitCode { get; } protected PdftractException(int exitCode, string? message) : base(message) { ExitCode = exitCode; } protected PdftractException(int exitCode, string? message, Exception? innerException) : base(message, innerException) { ExitCode = exitCode; } /// /// Maps an exit code and stderr to the appropriate exception type. /// public static PdftractException FromExitCode(int exitCode, string stderr) { var message = string.IsNullOrEmpty(stderr) ? "unknown error" : stderr; return exitCode switch { 2 => new CorruptPdfException(exitCode, message), 3 => new EncryptionException(exitCode, message), 4 => new SourceUnreachableException(exitCode, message), 5 => new RemoteFetchInterruptedException(exitCode, message), 6 => new TlsException(exitCode, message), 10 => new ReceiptVerifyException(exitCode, message), _ => new UnknownPdftractException(exitCode, message) }; } } /// /// Unknown pdftract error (unexpected exit code). /// public sealed class UnknownPdftractException : PdftractException { public UnknownPdftractException(int exitCode, string? message) : base(exitCode, message) { } } /// /// Corrupt PDF error (exit code 2). /// public sealed class CorruptPdfException : PdftractException { public CorruptPdfException(int exitCode, string? message) : base(exitCode, message) { } } /// /// Encryption error (exit code 3) — password missing or incorrect. /// public sealed class EncryptionException : PdftractException { public EncryptionException(int exitCode, string? message) : base(exitCode, message) { } } /// /// Source unreachable error (exit code 4) — file or URL cannot be read. /// public sealed class SourceUnreachableException : PdftractException { public SourceUnreachableException(int exitCode, string? message) : base(exitCode, message) { } } /// /// Remote fetch interrupted error (exit code 5) — network connection failed. /// public sealed class RemoteFetchInterruptedException : PdftractException { public RemoteFetchInterruptedException(int exitCode, string? message) : base(exitCode, message) { } } /// /// TLS/certificate error (exit code 6) — certificate validation failed. /// public sealed class TlsException : PdftractException { public TlsException(int exitCode, string? message) : base(exitCode, message) { } } /// /// Receipt verification failure (exit code 10). /// public sealed class ReceiptVerifyException : PdftractException { public ReceiptVerifyException(int exitCode, string? message) : base(exitCode, message) { } }