| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "error_support.h" |
| |
| #include <cassert> |
| |
| namespace v8_crdtp { |
| |
| void ErrorSupport::Push() { |
| stack_.emplace_back(); |
| } |
| |
| void ErrorSupport::Pop() { |
| stack_.pop_back(); |
| } |
| |
| void ErrorSupport::SetName(const char* name) { |
| assert(!stack_.empty()); |
| stack_.back().type = NAME; |
| stack_.back().name = name; |
| } |
| |
| void ErrorSupport::SetIndex(size_t index) { |
| assert(!stack_.empty()); |
| stack_.back().type = INDEX; |
| stack_.back().index = index; |
| } |
| |
| void ErrorSupport::AddError(const char* error) { |
| assert(!stack_.empty()); |
| if (!errors_.empty()) |
| errors_ += "; "; |
| for (size_t ii = 0; ii < stack_.size(); ++ii) { |
| if (ii) |
| errors_ += "."; |
| const Segment& s = stack_[ii]; |
| switch (s.type) { |
| case NAME: |
| errors_ += s.name; |
| continue; |
| case INDEX: |
| errors_ += std::to_string(s.index); |
| continue; |
| default: |
| assert(s.type != EMPTY); |
| continue; |
| } |
| } |
| errors_ += ": "; |
| errors_ += error; |
| } |
| |
| span<uint8_t> ErrorSupport::Errors() const { |
| return SpanFrom(errors_); |
| } |
| |
| } // namespace v8_crdtp |