aboutsummaryrefslogtreecommitdiff
path: root/lib/Net.Compression/VNLib.Net.Compression/ThrowHelper.cs
blob: 40ce336e3bd9533ac6ed335f6750661faf9db9fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
* 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
        }

        /// <summary>
        /// Determines if the specified result is an error and throws an exception if it is
        /// </summary>
        /// <param name="result"></param>
        /// <exception cref="NativeCompressionException"></exception>
        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}"),
            };
        }
    }
}