// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/guest_os/guest_os_diagnostics_builder.h"
#include <utility>
#include "base/check_op.h"
#include "chrome/browser/ash/guest_os/guest_os_diagnostics.mojom.h"
#include "ui/base/l10n/l10n_util.h"
namespace guest_os {
namespace {
using Status = mojom::DiagnosticEntry::Status;
} // namespace
DiagnosticsBuilder::DiagnosticsBuilder() {
diagnostics_ = mojom::Diagnostics::New();
}
DiagnosticsBuilder::~DiagnosticsBuilder() = default;
mojom::DiagnosticsPtr DiagnosticsBuilder::Build() {
return std::move(diagnostics_);
}
DiagnosticsBuilder::EntryBuilder::EntryBuilder(const std::string& requirement)
: entry_{mojom::DiagnosticEntry::New(requirement,
Status::kPass,
/*explanation=*/nullptr)} {}
DiagnosticsBuilder::EntryBuilder::EntryBuilder(int requirement_message_id)
: EntryBuilder(l10n_util::GetStringUTF8(requirement_message_id)) {}
DiagnosticsBuilder::EntryBuilder::EntryBuilder(EntryBuilder&&) = default;
DiagnosticsBuilder::EntryBuilder::~EntryBuilder() = default;
void DiagnosticsBuilder::EntryBuilder::SetNotApplicable() {
DCHECK_EQ(entry_->status, Status::kPass)
<< "SetNotApplicable() should only be called on a builder in the initial "
"state";
entry_->status = Status::kNotApplicable;
}
DiagnosticsBuilder::EntryBuilder& DiagnosticsBuilder::EntryBuilder::SetFail(
const std::string& explanation,
const std::optional<GURL>& learn_more_link) {
DCHECK_EQ(entry_->status, Status::kPass)
<< "SetFail() should only be called on a builder in the initial state";
entry_->status = Status::kFail;
entry_->explanation =
mojom::DiagnosticMessage::New(explanation, learn_more_link);
return *this;
}
void DiagnosticsBuilder::EntryBuilder::OverrideTopError(
const std::string& error,
const std::optional<GURL>& learn_more_link) {
DCHECK_EQ(entry_->status, Status::kFail);
overridden_top_error_ = mojom::DiagnosticMessage::New(error, learn_more_link);
}
DiagnosticsBuilder::EntryBuilder& DiagnosticsBuilder::EntryBuilder::SetFail(
int explanation_message_id,
const std::optional<GURL>& learn_more_link) {
return SetFail(l10n_util::GetStringUTF8(explanation_message_id),
learn_more_link);
}
void DiagnosticsBuilder::EntryBuilder::OverrideTopError(
int error_message_id,
const std::optional<GURL>& learn_more_link) {
return OverrideTopError(l10n_util::GetStringUTF8(error_message_id),
learn_more_link);
}
void DiagnosticsBuilder::AddEntry(EntryBuilder entry_builder) {
// Note that `entry_builder.overridden_top_error_` might be moved inside this
// block.
if (!diagnostics_->top_error &&
entry_builder.entry_->status == Status::kFail) {
// Need to update the diagnostics's top error.
if (entry_builder.overridden_top_error_) {
diagnostics_->top_error = std::move(entry_builder.overridden_top_error_);
} else {
// No overridden top error. Let's use the "explanation".
DCHECK(entry_builder.entry_->explanation);
diagnostics_->top_error = entry_builder.entry_->explanation.Clone();
}
}
diagnostics_->entries.push_back(std::move(entry_builder.entry_));
}
} // namespace guest_os