| // Copyright 2019 The Fuchsia 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 "src/developer/debug/zxdb/expr/format_node.h" | |
| #include <lib/syslog/cpp/macros.h> | |
| #include "src/developer/debug/zxdb/expr/eval_context.h" | |
| namespace zxdb { | |
| FormatNode::FormatNode(const std::string& name) : name_(name), weak_factory_(this) {} | |
| FormatNode::FormatNode(const std::string& name, ExprValue value) | |
| : source_(kValue), | |
| state_(kHasValue), | |
| name_(name), | |
| value_(std::move(value)), | |
| weak_factory_(this) {} | |
| FormatNode::FormatNode(const std::string& name, ErrOrValue err_or_value) | |
| : source_(kValue), | |
| state_(err_or_value.has_error() ? kDescribed : kHasValue), | |
| name_(name), | |
| value_(err_or_value.take_value_or_empty()), | |
| err_(err_or_value.err_or_empty()), | |
| weak_factory_(this) {} | |
| FormatNode::FormatNode(const std::string& name, Err err) | |
| : source_(kValue), state_(kDescribed), name_(name), err_(std::move(err)), weak_factory_(this) {} | |
| FormatNode::FormatNode(const std::string& name, const std::string& expression) | |
| : source_(kExpression), | |
| state_(kUnevaluated), | |
| name_(name), | |
| expression_(expression), | |
| weak_factory_(this) {} | |
| FormatNode::FormatNode(const std::string& name, GetProgramaticValue get_value) | |
| : source_(kProgramatic), | |
| state_(kUnevaluated), | |
| name_(name), | |
| get_programatic_value_(std::move(get_value)), | |
| weak_factory_(this) { | |
| FX_DCHECK(get_programatic_value_); // Caller must specify nonempty func. | |
| } | |
| FormatNode::FormatNode(GroupTag) | |
| : source_(kValue), // Don't compute a value, there is none. | |
| state_(kDescribed), | |
| description_kind_(kGroup), | |
| weak_factory_(this) {} | |
| FormatNode::~FormatNode() = default; | |
| fxl::WeakPtr<FormatNode> FormatNode::GetWeakPtr() { return weak_factory_.GetWeakPtr(); } | |
| void FormatNode::FillProgramaticValue(const fxl::RefPtr<EvalContext>& context, | |
| fit::deferred_callback cb) { | |
| FX_DCHECK(source() == kProgramatic); | |
| FX_DCHECK(get_programatic_value_); | |
| get_programatic_value_(std::move(context), [weak_node = GetWeakPtr(), cb = std::move(cb)]( | |
| const Err& err, ExprValue value) { | |
| if (weak_node) { | |
| weak_node->state_ = kHasValue; | |
| if (err.has_error()) | |
| weak_node->set_err(err); | |
| else | |
| weak_node->SetValue(std::move(value)); | |
| } | |
| }); | |
| } | |
| void FormatNode::SetValue(ExprValue v) { | |
| value_ = std::move(v); | |
| set_state(kHasValue); | |
| } | |
| void FormatNode::SetDescribedError(const Err& e) { | |
| set_err(e); | |
| set_state(kDescribed); | |
| } | |
| } // namespace zxdb |