/*
* Copyright (c) 2023 Vaughn Nugent
*
* Library: VNLib
* Package: VNLib.Net.Compression
* File: ThrowHelper.cs
*
* ThrowHelper.cs is part of VNLib.Net.Compression which is part of
* the larger VNLib collection of libraries and utilities.
*
* VNLib.Net.Compression is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 2 of the License,
* or (at your option) any later version.
*
* VNLib.Net.Compression is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with VNLib.Net.Compression. If not, see http://www.gnu.org/licenses/.
*/
using System;
namespace VNLib.Net.Compression
{
internal static class ThrowHelper
{
/*
* Error codes correspond to constants
* in the native compression library
*/
enum NativeErrorType
{
ErrInvalidPtr = -1,
ErrOutOfMemory = -2,
ErrCompTypeNotSupported = -9,
ErrCompLevelNotSupported = -10,
ErrInvalidInput = -11,
ErrInvalidOutput = -12,
ErrCompressionFailed = -13,
ErrCompOverflow = -14,
ErrGzInvalidState = -16,
ErrGzOverflow = -17,
ErrBrInvalidState = -24
}
///
/// Determines if the specified result is an error and throws an exception if it is
///
///
///
public static void ThrowIfError(long result)
{
//Check for no error
if(result >= 0)
{
return;
}
throw (NativeErrorType)result switch
{
NativeErrorType.ErrInvalidPtr => new NativeCompressionException("A pointer to a compressor instance was null"),
NativeErrorType.ErrOutOfMemory => new NativeCompressionException("An operation falied because the system is out of memory"),
NativeErrorType.ErrCompTypeNotSupported => new NotSupportedException("The desired compression method is not supported by the native library"),
NativeErrorType.ErrCompLevelNotSupported => new NotSupportedException("The desired compression level is not supported by the native library"),
NativeErrorType.ErrInvalidInput => new NativeCompressionException("The input buffer was null and the input size was greater than 0"),
NativeErrorType.ErrInvalidOutput => new NativeCompressionException("The output buffer was null and the output size was greater than 0"),
NativeErrorType.ErrGzInvalidState => new NativeCompressionException("A gzip operation failed because the compressor state is invalid (null compressor pointer)"),
NativeErrorType.ErrGzOverflow => new NativeCompressionException("A gzip operation failed because the output buffer is too small"),
NativeErrorType.ErrBrInvalidState => new NativeCompressionException("A brotli operation failed because the compressor state is invalid (null compressor pointer)"),
NativeErrorType.ErrCompOverflow => new OverflowException("A call to compress block or get block size failed because the library would cause an integer overflow processing your data"),
NativeErrorType.ErrCompressionFailed => new NativeCompressionException("An operation failes because the underlying implementation would cause a memory related error. State is considered corrupted"),
_ => new NativeCompressionException($"An unknown error occurred, code: 0x{result:x}"),
};
}
}
}