@@ -36,11 +36,30 @@ class Error
3636 // The error with brief info
3737 explicit Error (rd_kafka_resp_err_t respErr): _respErr(respErr) {}
3838 // The error with detailed message
39- Error (rd_kafka_resp_err_t respErr, std::string message)
40- : _respErr(respErr), _message(std::move(message)) {}
41- Error ( rd_kafka_resp_err_t respErr, std::string message, bool fatal)
42- : _respErr(respErr), _message(std::move(message)), _fatal(fatal) { }
39+ Error (rd_kafka_resp_err_t respErr, std::string message, bool fatal = false )
40+ : _respErr(respErr), _message(std::move(message)), _isFatal(fatal) {}
41+ // Copy constructor
42+ Error ( const Error& error) { * this = error; }
4343
44+ // Assignment operator
45+ Error& operator =(const Error& error)
46+ {
47+ if (this == &error) return *this ;
48+
49+ _rkError.reset ();
50+
51+ _respErr = static_cast <rd_kafka_resp_err_t >(error.value ());
52+ _message = error._message ;
53+ _isFatal = error.isFatal ();
54+ _txnRequiresAbort = error.transactionRequiresAbort ();
55+ _isRetriable = error.isRetriable ();
56+
57+ return *this ;
58+ }
59+
60+ /* *
61+ * Check if the error is valid.
62+ */
4463 explicit operator bool () const { return static_cast <bool >(value ()); }
4564
4665 /* *
@@ -80,9 +99,7 @@ class Error
8099 {
81100 std::ostringstream oss;
82101
83- oss << rd_kafka_err2str (static_cast <rd_kafka_resp_err_t >(value ())) << " [" << value () << " ]" ;
84-
85- if (auto fatal = isFatal ()) oss << " | " << (*fatal ? " fatal" : " non-fatal" );
102+ oss << rd_kafka_err2str (static_cast <rd_kafka_resp_err_t >(value ())) << " [" << value () << " ]" << (isFatal () ? " fatal" : " " );
86103 if (transactionRequiresAbort ()) oss << " | transaction-requires-abort" ;
87104 if (auto retriable = isRetriable ()) oss << " | " << (*retriable ? " retriable" : " non-retriable" );
88105 if (_message) oss << " | " << *_message;
@@ -93,17 +110,17 @@ class Error
93110 /* *
94111 * Fatal error indicates that the client instance is no longer usable.
95112 */
96- Optional< bool > isFatal () const
113+ bool isFatal () const
97114 {
98- return _rkError ? rd_kafka_error_is_fatal (_rkError.get ()) : _fatal ;
115+ return _rkError ? rd_kafka_error_is_fatal (_rkError.get ()) : _isFatal ;
99116 }
100117
101118 /* *
102119 * Show whether the operation may be retried.
103120 */
104121 Optional<bool > isRetriable () const
105122 {
106- return _rkError ? rd_kafka_error_is_retriable (_rkError.get ()) : Optional< bool >{} ;
123+ return _rkError ? rd_kafka_error_is_retriable (_rkError.get ()) : _isRetriable ;
107124 }
108125
109126 /* *
@@ -122,7 +139,9 @@ class Error
122139 rd_kafka_error_shared_ptr _rkError; // For error with rich info
123140 rd_kafka_resp_err_t _respErr{}; // For error with a simple response code
124141 Optional<std::string> _message; // Additional detailed message (if any)
125- Optional<bool > _fatal; // Fatal flag (if any)
142+ bool _isFatal = false ;
143+ bool _txnRequiresAbort = false ;
144+ Optional<bool > _isRetriable; // Retriable flag (if any)
126145};
127146
128147} // end of KAFKA_API
0 commit comments