IRSOL
C++ code implementing socket server for interacting with Baumer camera.
irsol::protocol::internal::ParserResult< T, > Class Template Reference

Wrapper for the result of a protocol parsing attempt. More...

#include <parser_result.hpp>

Public Types

using result_type = T
 
using error_type = std::string
 
using message_type = std::variant< result_type, error_type >
 

Public Member Functions

 ParserResult (result_type &&message)
 Constructs a successful parser result.
 
 ParserResult (error_type &&error)
 Constructs a failed parser result with an error string.
 
 ParserResult (const ParserResult &)=delete
 
ParserResultoperator= (ParserResult &&) noexcept=delete
 
ParserResultoperator= (const ParserResult &)=delete
 
 operator bool () const
 Checks whether this result contains a valid message.
 
bool isMessage () const
 Returns true if the result contains a parsed message.
 
bool isError () const
 Returns true if the result contains an error message.
 
result_type getMessage () const
 Returns the contained message.
 
error_type getError () const
 Returns the contained error string.
 
std::string toString () const
 Returns a human-readable string representation of the result.
 

Private Attributes

message_type _messageOrError
 

Detailed Description

template<typename T, std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
class irsol::protocol::internal::ParserResult< T, >

Wrapper for the result of a protocol parsing attempt.

Template Parameters
TThe message type expected from parsing, constrained to be a variant member of irsol::protocol::InMessage.

This class represents the outcome of trying to parse a protocol input line into a specific message type. It holds either a successfully parsed message of type T or an error message describing why parsing failed.

See also
irsol::protocol::Parser

The interface allows:

  • Checking if parsing was successful (operator bool(), isMessage())
  • Retrieving the parsed message (getMessage())
  • Retrieving the error message if parsing failed (getError())
  • Getting a human-readable string describing the result (toString())

This class disables copying and move assignment to prevent accidental duplication of results.

Example:

if (result) {
auto msg = result.getMessage();
// Process msg...
} else {
std::cerr << "Parse error: " << result.getError() << std::endl;
}
static internal::ParserResult< Assignment > parseAssignment(const std::string &line)
Parses an assignment message from a protocol line.
Definition parser.cpp:48
Wrapper for the result of a protocol parsing attempt.
auto result
auto msg

Definition at line 61 of file parser_result.hpp.

Member Typedef Documentation

◆ error_type

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
using irsol::protocol::internal::ParserResult< T, >::error_type = std::string

Definition at line 65 of file parser_result.hpp.

◆ message_type

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
using irsol::protocol::internal::ParserResult< T, >::message_type = std::variant<result_type, error_type>

Definition at line 66 of file parser_result.hpp.

◆ result_type

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
using irsol::protocol::internal::ParserResult< T, >::result_type = T

Definition at line 64 of file parser_result.hpp.

Constructor & Destructor Documentation

◆ ParserResult() [1/3]

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
irsol::protocol::internal::ParserResult< T, >::ParserResult ( result_type &&  message)
inline

Constructs a successful parser result.

Parameters
messageA valid parsed message.

Definition at line 72 of file parser_result.hpp.

72: _messageOrError(std::move(message)) {}

◆ ParserResult() [2/3]

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
irsol::protocol::internal::ParserResult< T, >::ParserResult ( error_type &&  error)
inline

Constructs a failed parser result with an error string.

Parameters
errorA descriptive error message.

Definition at line 77 of file parser_result.hpp.

77: _messageOrError(std::move(error)) {}

◆ ParserResult() [3/3]

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
irsol::protocol::internal::ParserResult< T, >::ParserResult ( const ParserResult< T, > &  )
delete

Member Function Documentation

◆ getError()

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
error_type irsol::protocol::internal::ParserResult< T, >::getError ( ) const
inline

Returns the contained error string.

Exceptions
std::bad_variant_accessif no error is stored.

Definition at line 118 of file parser_result.hpp.

119 {
120 return std::get<error_type>(_messageOrError);
121 }

◆ getMessage()

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
result_type irsol::protocol::internal::ParserResult< T, >::getMessage ( ) const
inline

Returns the contained message.

Exceptions
std::bad_variant_accessif no message is stored.

Definition at line 110 of file parser_result.hpp.

111 {
112 return std::get<result_type>(_messageOrError);
113 }

◆ isError()

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
bool irsol::protocol::internal::ParserResult< T, >::isError ( ) const
inline

Returns true if the result contains an error message.

Definition at line 101 of file parser_result.hpp.

102 {
103 return std::holds_alternative<error_type>(_messageOrError);
104 }

◆ isMessage()

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
bool irsol::protocol::internal::ParserResult< T, >::isMessage ( ) const
inline

Returns true if the result contains a parsed message.

Definition at line 94 of file parser_result.hpp.

95 {
96 return std::holds_alternative<result_type>(_messageOrError);
97 }

◆ operator bool()

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
irsol::protocol::internal::ParserResult< T, >::operator bool ( ) const
inlineexplicit

Checks whether this result contains a valid message.

Returns
true if a message is stored; false if it's an error.

Definition at line 87 of file parser_result.hpp.

88 {
89 return isMessage();
90 }
bool isMessage() const
Returns true if the result contains a parsed message.

◆ operator=() [1/2]

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
ParserResult & irsol::protocol::internal::ParserResult< T, >::operator= ( const ParserResult< T, > &  )
delete

◆ operator=() [2/2]

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
ParserResult & irsol::protocol::internal::ParserResult< T, >::operator= ( ParserResult< T, > &&  )
deletenoexcept

◆ toString()

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
std::string irsol::protocol::internal::ParserResult< T, >::toString ( ) const
inline

Returns a human-readable string representation of the result.

Returns
A human-readable string representation of the result.

Definition at line 128 of file parser_result.hpp.

129 {
130 std::string message_string;
131 std::string message_type;
132 if(isMessage()) {
133 message_string = getMessage().toString();
134 message_type = "Message";
135 } else if(isError()) {
136 message_string = getError();
137 message_type = "Error";
138 } else {
139 IRSOL_ASSERT_FATAL("Both 'isMessage()' and 'isError()' returned false");
140 }
141
142 std::stringstream ss;
143 ss << "ParserResult<" << message_type << ">('" << message_string << "')";
144 return ss.str();
145 }
result_type getMessage() const
Returns the contained message.
error_type getError() const
Returns the contained error string.
std::variant< result_type, error_type > message_type
bool isError() const
Returns true if the result contains an error message.
#define IRSOL_ASSERT_FATAL
Fatal-level assertion macro.
Definition assert.hpp:135

Member Data Documentation

◆ _messageOrError

template<typename T , std::enable_if_t< irsol::traits::is_type_in_variant_v< T, InMessage >, int > = 0>
message_type irsol::protocol::internal::ParserResult< T, >::_messageOrError
private

Definition at line 148 of file parser_result.hpp.


The documentation for this class was generated from the following file: