aboutsummaryrefslogtreecommitdiff
path: root/src/support/error/error_capacitor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/support/error/error_capacitor.cc')
-rw-r--r--src/support/error/error_capacitor.cc37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/support/error/error_capacitor.cc b/src/support/error/error_capacitor.cc
new file mode 100644
index 0000000..58cfb81
--- /dev/null
+++ b/src/support/error/error_capacitor.cc
@@ -0,0 +1,37 @@
+#include "error_capacitor.h"
+
+namespace InputXSLT {
+
+ErrorCapacitor::ErrorCapacitor(ErrorMultiplexer* multiplexer):
+ multiplexer_(multiplexer),
+ error_cache_(new error_cache()) {
+ this->multiplexer_->connectReceiver(this);
+}
+
+ErrorCapacitor::~ErrorCapacitor() {
+ this->multiplexer_->disconnectReceiver(this);
+}
+
+void ErrorCapacitor::discharge() {
+ if ( !this->error_cache_->empty() ) {
+ throw exception(std::move(this->error_cache_));
+ }
+}
+
+void ErrorCapacitor::receive(
+ const ErrorMultiplexer::ErrorType type,
+ const std::string& message
+) {
+ if ( type == ErrorMultiplexer::ErrorType::Error ) {
+ this->error_cache_->emplace_back(message);
+ }
+}
+
+ErrorCapacitor::exception::exception(error_cache_ptr ptr):
+ error_cache_(std::move(ptr)) { }
+
+auto ErrorCapacitor::exception::getCachedErrors() const -> const error_cache* {
+ return this->error_cache_.get();
+}
+
+}