blob: 26d9d391cf7d9e24bd34d8b28ffdcf2a8c343d11 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/enterprise/data_controls/verdict.h"
#include <utility>
namespace data_controls {
namespace {
base::OnceClosure MergedReportClosure(
base::OnceClosure source_report_closure,
base::OnceClosure destination_report_closure) {
if (source_report_closure) {
if (destination_report_closure) {
return base::BindOnce(
[](base::OnceClosure source_report_closure,
base::OnceClosure destination_report_closure) {
std::move(source_report_closure).Run();
std::move(destination_report_closure).Run();
},
std::move(source_report_closure),
std::move(destination_report_closure));
}
return source_report_closure;
}
return destination_report_closure;
}
} // namespace
// static
Verdict Verdict::NotSet() {
return Verdict(Rule::Level::kNotSet);
}
// static
Verdict Verdict::Report(base::OnceClosure initial_report_closure) {
return Verdict(Rule::Level::kReport, std::move(initial_report_closure));
}
// static
Verdict Verdict::Warn(base::OnceClosure initial_report_closure,
base::OnceClosure bypass_report_closure) {
return Verdict(Rule::Level::kWarn, std::move(initial_report_closure),
std::move(bypass_report_closure));
}
// static
Verdict Verdict::Block(base::OnceClosure initial_report_closure) {
return Verdict(Rule::Level::kBlock, std::move(initial_report_closure));
}
// static
Verdict Verdict::Allow() {
return Verdict(Rule::Level::kAllow);
}
// static
Verdict Verdict::Merge(Verdict source_profile_verdict,
Verdict destination_profile_verdict) {
Rule::Level level = source_profile_verdict.level();
if (destination_profile_verdict.level() > level) {
level = destination_profile_verdict.level();
}
return Verdict(level,
MergedReportClosure(
source_profile_verdict.TakeInitialReportClosure(),
destination_profile_verdict.TakeInitialReportClosure()),
MergedReportClosure(
source_profile_verdict.TakeBypassReportClosure(),
destination_profile_verdict.TakeBypassReportClosure()));
}
Verdict::Verdict(Rule::Level level,
base::OnceClosure initial_report_closure,
base::OnceClosure bypass_report_closure)
: level_(level),
initial_report_closure_(std::move(initial_report_closure)),
bypass_report_closure_(std::move(bypass_report_closure)) {}
Verdict::~Verdict() = default;
Verdict::Verdict(Verdict&& other) = default;
Verdict& Verdict::operator=(Verdict&& other) = default;
Rule::Level Verdict::level() const {
return level_;
}
base::OnceClosure Verdict::TakeInitialReportClosure() {
return std::move(initial_report_closure_);
}
base::OnceClosure Verdict::TakeBypassReportClosure() {
return std::move(bypass_report_closure_);
}
} // namespace data_controls