Skip to content

Commit

Permalink
Initial addition of helpers.
Browse files Browse the repository at this point in the history
  • Loading branch information
nealkruis committed Feb 14, 2024
1 parent bbb8e2a commit d6fad8b
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 42 deletions.
62 changes: 62 additions & 0 deletions include/courier/helpers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* Copyright (c) 2019 Big Ladder Software LLC. All rights reserved.
* See the LICENSE file for additional terms and conditions. */

#pragma once

#include <fmt/format.h>

#include "courier.h"

namespace Courier {

class DefaultCourier : public Courier {
void receive_error(const std::string& message) override { write_message("ERROR", message); }
void receive_warning(const std::string& message) override { write_message("WARNING", message); }
void receive_info(const std::string& message) override { write_message("INFO", message); }
void receive_debug(const std::string& message) override { write_message("DEBUG", message); }
virtual void write_message(const std::string& message_type, const std::string& message)
{
std::cout << fmt::format("[{}] {}", message_type, message) << std::endl;
std::cout << " Generated using Courier::DefaultCourier. Consider deriving your own "
"Courier class!"
<< std::endl;
}
};

class Dispatcher {
public:
explicit Dispatcher(
std::string name_in,
const std::shared_ptr<Courier>& courier_in = std::make_shared<DefaultCourier>())
: name(std::move(name_in)), courier(courier_in) {};
std::string name;

protected:
std::shared_ptr<Courier> courier;
Dispatcher* parent_pointer {nullptr};
std::string class_name;
std::string message_format {"{} '{}': {}"};
[[nodiscard]] std::string make_message(const std::string& message) const // NOLINT
{
std::string local_message = fmt::format(message_format, class_name, name, message);
if (parent_pointer) {
return parent_pointer->make_message(local_message);
}
return local_message;
}
void send_error(const std::string& message) const
{
courier->send_error(make_message(message));
}
void send_warning(const std::string& message) const
{
courier->send_warning(make_message(message));
}
void send_info(const std::string& message) const { courier->send_info(make_message(message)); }
void send_debug(const std::string& message) const
{
courier->send_debug(make_message(message));
}
};

} // namespace Courier
2 changes: 1 addition & 1 deletion test/courier_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ TEST(Courier, Default)
LibraryClass new_library_object("My library object");
std::string expected_output {
"[DEBUG] LibraryClass 'My library object': Something for the developer happened.\n "
"Generated using LibraryDefaultCourier. Consider deriving your own Courier class!\n"};
"Generated using Courier::DefaultCourier. Consider deriving your own Courier class!\n"};
EXPECT_STDOUT(new_library_object.generate_debug();, expected_output)
}

Expand Down
52 changes: 11 additions & 41 deletions test/library.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,25 @@
#include <string>
#include <utility>
#include <courier/courier.h>
#include <courier/helpers.h>
#include <fmt/format.h>

class LibraryDefaultCourier : public Courier::Courier {
void receive_error(const std::string& message) override { write_message("ERROR", message); }
void receive_warning(const std::string& message) override { write_message("WARNING", message); }
void receive_info(const std::string& message) override { write_message("INFO", message); }
void receive_debug(const std::string& message) override { write_message("DEBUG", message); }
virtual void write_message(const std::string& message_type, const std::string& message)
{
std::cout << fmt::format("[{}] {}", message_type, message) << std::endl;
std::cout
<< " Generated using LibraryDefaultCourier. Consider deriving your own Courier class!"
<< std::endl;
}
};

class LibraryClass {
class LibraryClass : Courier::Dispatcher {
public:
LibraryClass(std::string name_in,
const std::shared_ptr<Courier::Courier>& courier_in =
std::make_shared<LibraryDefaultCourier>())
: name(std::move(name_in)), courier(courier_in)
explicit LibraryClass(std::string name_in,
const std::shared_ptr<Courier::Courier>& courier_in =
std::make_shared<Courier::DefaultCourier>())
: Courier::Dispatcher(std::move(name_in), courier_in)
{
class_name = "LibraryClass";
}
void generate_debug()
{
courier->send_debug(make_message("Something for the developer happened."));
}
void generate_info()
{
courier->send_info(make_message("Something you should notice happened."));
}
void generate_warning()
{
courier->send_warning(make_message("Something unexpected happened."));
}
void generate_error() { courier->send_error(make_message("Something serious happened.")); }
void generate_debug() { send_debug("Something for the developer happened."); }
void generate_info() { send_info("Something you should notice happened."); }
void generate_warning() { send_warning("Something unexpected happened."); }
void generate_error() { send_error("Something serious happened."); }
void set_courier(std::shared_ptr<Courier::Courier> courier_in)
{
courier = std::move(courier_in);
}
std::shared_ptr<Courier::Courier> get_courier() { return courier; }

private:
std::string name;
std::shared_ptr<Courier::Courier> courier;
static constexpr std::string_view message_format {"LibraryClass '{}': {}"};
std::string make_message(const std::string& message)
{
return fmt::format(message_format, name, message);
}
};

0 comments on commit d6fad8b

Please sign in to comment.