1*3117ece4Schristos /* 2*3117ece4Schristos * Copyright (c) Meta Platforms, Inc. and affiliates. 3*3117ece4Schristos * All rights reserved. 4*3117ece4Schristos * 5*3117ece4Schristos * This source code is licensed under both the BSD-style license (found in the 6*3117ece4Schristos * LICENSE file in the root directory of this source tree) and the GPLv2 (found 7*3117ece4Schristos * in the COPYING file in the root directory of this source tree). 8*3117ece4Schristos * You may select, at your option, one of the above-listed licenses. 9*3117ece4Schristos */ 10*3117ece4Schristos 11*3117ece4Schristos #ifndef RESULT_H 12*3117ece4Schristos #define RESULT_H 13*3117ece4Schristos 14*3117ece4Schristos #include <stddef.h> 15*3117ece4Schristos 16*3117ece4Schristos /** 17*3117ece4Schristos * The error type enum. 18*3117ece4Schristos */ 19*3117ece4Schristos typedef enum { 20*3117ece4Schristos result_error_ok, /**< No error. */ 21*3117ece4Schristos result_error_skip, /**< This method was skipped. */ 22*3117ece4Schristos result_error_system_error, /**< Some internal error happened. */ 23*3117ece4Schristos result_error_compression_error, /**< Compression failed. */ 24*3117ece4Schristos result_error_decompression_error, /**< Decompression failed. */ 25*3117ece4Schristos result_error_round_trip_error, /**< Data failed to round trip. */ 26*3117ece4Schristos } result_error_t; 27*3117ece4Schristos 28*3117ece4Schristos /** 29*3117ece4Schristos * The success type. 30*3117ece4Schristos */ 31*3117ece4Schristos typedef struct { 32*3117ece4Schristos size_t total_size; /**< The total compressed size. */ 33*3117ece4Schristos } result_data_t; 34*3117ece4Schristos 35*3117ece4Schristos /** 36*3117ece4Schristos * The result type. 37*3117ece4Schristos * Do not access the member variables directory, use the helper functions. 38*3117ece4Schristos */ 39*3117ece4Schristos typedef struct { 40*3117ece4Schristos result_error_t internal_error; 41*3117ece4Schristos result_data_t internal_data; 42*3117ece4Schristos } result_t; 43*3117ece4Schristos 44*3117ece4Schristos /** 45*3117ece4Schristos * Create a result of the error type. 46*3117ece4Schristos */ 47*3117ece4Schristos static result_t result_error(result_error_t error); 48*3117ece4Schristos /** 49*3117ece4Schristos * Create a result of the success type. 50*3117ece4Schristos */ 51*3117ece4Schristos static result_t result_data(result_data_t data); 52*3117ece4Schristos 53*3117ece4Schristos /** 54*3117ece4Schristos * Check if the result is an error or skip. 55*3117ece4Schristos */ 56*3117ece4Schristos static int result_is_error(result_t result); 57*3117ece4Schristos /** 58*3117ece4Schristos * Check if the result error is skip. 59*3117ece4Schristos */ 60*3117ece4Schristos static int result_is_skip(result_t result); 61*3117ece4Schristos /** 62*3117ece4Schristos * Get the result error or okay. 63*3117ece4Schristos */ 64*3117ece4Schristos static result_error_t result_get_error(result_t result); 65*3117ece4Schristos /** 66*3117ece4Schristos * Get the result data. The result MUST be checked with result_is_error() first. 67*3117ece4Schristos */ 68*3117ece4Schristos static result_data_t result_get_data(result_t result); 69*3117ece4Schristos 70*3117ece4Schristos static result_t result_error(result_error_t error) { 71*3117ece4Schristos result_t result = { 72*3117ece4Schristos .internal_error = error, 73*3117ece4Schristos }; 74*3117ece4Schristos return result; 75*3117ece4Schristos } 76*3117ece4Schristos 77*3117ece4Schristos static result_t result_data(result_data_t data) { 78*3117ece4Schristos result_t result = { 79*3117ece4Schristos .internal_error = result_error_ok, 80*3117ece4Schristos .internal_data = data, 81*3117ece4Schristos }; 82*3117ece4Schristos return result; 83*3117ece4Schristos } 84*3117ece4Schristos 85*3117ece4Schristos static int result_is_error(result_t result) { 86*3117ece4Schristos return result_get_error(result) != result_error_ok; 87*3117ece4Schristos } 88*3117ece4Schristos 89*3117ece4Schristos static int result_is_skip(result_t result) { 90*3117ece4Schristos return result_get_error(result) == result_error_skip; 91*3117ece4Schristos } 92*3117ece4Schristos 93*3117ece4Schristos static result_error_t result_get_error(result_t result) { 94*3117ece4Schristos return result.internal_error; 95*3117ece4Schristos } 96*3117ece4Schristos 97*3117ece4Schristos char const* result_get_error_string(result_t result); 98*3117ece4Schristos 99*3117ece4Schristos static result_data_t result_get_data(result_t result) { 100*3117ece4Schristos return result.internal_data; 101*3117ece4Schristos } 102*3117ece4Schristos 103*3117ece4Schristos #endif 104