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) { }
}