blob: 577622041a4085fb4a638b61562aa5d7de2d7cc2 [file] [log] [blame]
// 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