Added --progress option for diagram progress indicators

This commit is contained in:
Bartek Kryza
2023-06-15 00:24:40 +02:00
parent c387aba82e
commit 408416020f
7 changed files with 289 additions and 29 deletions

View File

@@ -0,0 +1,121 @@
/**
* src/common/generators/progress_indicator.cc
*
* Copyright (c) 2021-2023 Bartek Kryza <bkryza@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "progress_indicator.h"
#include <util/util.h>
namespace clanguml::common::generators {
progress_indicator::progress_indicator()
{
progress_bars_.set_option(indicators::option::HideBarWhenComplete{false});
}
void progress_indicator::add_progress_bar(
const std::string &name, size_t max, indicators::Color color)
{
auto postfix_text = max > 0 ? fmt::format("{}/{}", 0, max) : std::string{};
auto bar = std::make_shared<indicators::ProgressBar>(
indicators::option::BarWidth{34},
indicators::option::ForegroundColor{color},
indicators::option::ShowElapsedTime{true},
indicators::option::Fill{""}, indicators::option::Lead{""},
indicators::option::Remainder{"-"},
indicators::option::PrefixText{
fmt::format("{:<25}", util::abbreviate(name, 25))},
indicators::option::PostfixText{postfix_text});
progress_bars_mutex_.lock();
progress_bars_.push_back(*bar);
bars_.push_back(bar);
auto bar_index = bars_.size() - 1;
progress_bar_index_.emplace(
name, progress_state{.index = bar_index, .progress = 0, .max = max});
progress_bars_mutex_.unlock();
}
void progress_indicator::increment(const std::string &name)
{
progress_bars_mutex_.lock();
if (progress_bar_index_.count(name) == 0) {
progress_bars_mutex_.unlock();
return;
}
auto &p = progress_bar_index_.at(name);
auto &bar = progress_bars_[p.index];
progress_bars_mutex_.unlock();
p.progress++;
bar.set_progress((p.progress * 95) / p.max);
bar.set_option(indicators::option::PostfixText{
fmt::format("{}/{}", p.progress, p.max)});
}
void progress_indicator::stop()
{
progress_bars_mutex_.lock();
for (auto &[name, p] : progress_bar_index_) {
progress_bars_[p.index].mark_as_completed();
}
progress_bars_mutex_.unlock();
}
void progress_indicator::complete(const std::string &name)
{
progress_bars_mutex_.lock();
if (progress_bar_index_.count(name) == 0) {
progress_bars_mutex_.unlock();
return;
}
auto &p = progress_bar_index_.at(name);
auto &bar = progress_bars_[p.index];
progress_bars_mutex_.unlock();
bar.set_progress(100);
bar.set_option(indicators::option::PostfixText{
fmt::format("{}/{} ✔", p.progress, p.max)});
bar.set_option(
indicators::option::ForegroundColor{indicators::Color::green});
bar.mark_as_completed();
}
void progress_indicator::fail(const std::string &name)
{
progress_bars_mutex_.lock();
auto &p = progress_bar_index_.at(name);
auto &bar = progress_bars_[p.index];
progress_bars_mutex_.unlock();
bar.set_option(indicators::option::ForegroundColor{indicators::Color::red});
bar.set_option(indicators::option::PostfixText{
fmt::format("{}/{} ✗", p.progress, p.max)});
bar.mark_as_completed();
}
} // namespace clanguml::common::generators