mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:52:45 +00:00 
			
		
		
		
	 e8f1a2ef02
			
		
	
	
		e8f1a2ef02
		
	
	
	
	
		
			
			These should make it easier to create specific errors, specially when wanting to create a formatted message.
		
			
				
	
	
		
			115 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2022, Matthew Olsson <mattco@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/DeprecatedString.h>
 | |
| #include <AK/String.h>
 | |
| #include <AK/Vector.h>
 | |
| 
 | |
| namespace PDF {
 | |
| 
 | |
| class Error {
 | |
| public:
 | |
|     enum class Type {
 | |
|         Parse,
 | |
|         Internal,
 | |
|         MalformedPDF,
 | |
|         RenderingUnsupported
 | |
|     };
 | |
| 
 | |
|     Error(AK::Error error)
 | |
|         : m_type(Type::Internal)
 | |
|         , m_message(DeprecatedString::formatted("Internal error while processing PDF file: {}", error.string_literal()))
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Error(Type type, DeprecatedString const& message)
 | |
|         : Error(type, String::from_deprecated_string(message).release_value_but_fixme_should_propagate_errors())
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Error(Type type, String const& message)
 | |
|         : m_type(type)
 | |
|     {
 | |
|         switch (type) {
 | |
|         case Type::Parse:
 | |
|             m_message = DeprecatedString::formatted("Failed to parse PDF file: {}", message);
 | |
|             break;
 | |
|         case Type::Internal:
 | |
|             m_message = DeprecatedString::formatted("Internal error while processing PDF file: {}", message);
 | |
|             break;
 | |
|         case Type::MalformedPDF:
 | |
|             m_message = DeprecatedString::formatted("Malformed PDF file: {}", message);
 | |
|             break;
 | |
|         case Type::RenderingUnsupported:
 | |
|             m_message = DeprecatedString::formatted("Rendering of feature not supported: {}", message);
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     Type type() const { return m_type; }
 | |
|     DeprecatedString const& message() const { return m_message; }
 | |
| 
 | |
| #define DEFINE_STATIC_ERROR_FUNCTIONS(name, type)                                                           \
 | |
|     static Error name##_error(StringView message)                                                           \
 | |
|     {                                                                                                       \
 | |
|         return maybe_with_string(Type::type, String::from_utf8(message));                                   \
 | |
|     }                                                                                                       \
 | |
|                                                                                                             \
 | |
|     template<typename... Parameters>                                                                        \
 | |
|     static Error name##_error(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) \
 | |
|     {                                                                                                       \
 | |
|         return maybe_with_string(Type::type, String::formatted(move(fmtstr), parameters...));               \
 | |
|     }
 | |
| 
 | |
|     DEFINE_STATIC_ERROR_FUNCTIONS(parse, Parse)
 | |
|     DEFINE_STATIC_ERROR_FUNCTIONS(internal, Internal)
 | |
|     DEFINE_STATIC_ERROR_FUNCTIONS(malformed, MalformedPDF)
 | |
|     DEFINE_STATIC_ERROR_FUNCTIONS(rendering_unsupported, RenderingUnsupported)
 | |
| 
 | |
| private:
 | |
|     Type m_type;
 | |
|     DeprecatedString m_message;
 | |
| 
 | |
|     static Error maybe_with_string(Type type, ErrorOr<String> maybe_string)
 | |
|     {
 | |
|         if (maybe_string.is_error())
 | |
|             return Error { type, String {} };
 | |
|         return Error { type, maybe_string.release_value() };
 | |
|     }
 | |
| };
 | |
| 
 | |
| class Errors {
 | |
| 
 | |
| public:
 | |
|     Errors() = default;
 | |
|     Errors(Error&& error)
 | |
|     {
 | |
|         m_errors.empend(move(error));
 | |
|     }
 | |
| 
 | |
|     Vector<Error> const& errors() const
 | |
|     {
 | |
|         return m_errors;
 | |
|     }
 | |
| 
 | |
|     void add_error(Error&& error)
 | |
|     {
 | |
|         m_errors.empend(move(error));
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     Vector<Error> m_errors;
 | |
| };
 | |
| 
 | |
| template<typename T>
 | |
| using PDFErrorOr = ErrorOr<T, Error>;
 | |
| 
 | |
| template<typename T>
 | |
| using PDFErrorsOr = ErrorOr<T, Errors>;
 | |
| 
 | |
| }
 |