From cdb7ae4c729b6a6c51b57eeefd21574952a4b767 Mon Sep 17 00:00:00 2001 From: eportnov Date: Mon, 12 Sep 2022 16:46:44 +0300 Subject: refactoring --- src/message/builder/cc.cpp | 31 ++++++++++ src/message/builder/cc.hpp | 21 +++++++ src/message/builder/date.cpp | 16 +++++ src/message/builder/date.hpp | 17 ++++++ src/message/builder/from.cpp | 22 +++++++ src/message/builder/from.hpp | 19 ++++++ src/message/builder/mail_to.cpp | 23 ++++++++ src/message/builder/mail_to.hpp | 21 +++++++ src/message/builder/subject.cpp | 22 +++++++ src/message/builder/subject.hpp | 19 ++++++ src/message/builder/text.cpp | 24 ++++++++ src/message/builder/text.hpp | 19 ++++++ src/message/builder/types/idecorator.hpp | 82 ++++++++++++++++++++++++++ src/message/builder/types/imessage_builder.hpp | 14 +++++ 14 files changed, 350 insertions(+) create mode 100644 src/message/builder/cc.cpp create mode 100644 src/message/builder/cc.hpp create mode 100644 src/message/builder/date.cpp create mode 100644 src/message/builder/date.hpp create mode 100644 src/message/builder/from.cpp create mode 100644 src/message/builder/from.hpp create mode 100644 src/message/builder/mail_to.cpp create mode 100644 src/message/builder/mail_to.hpp create mode 100644 src/message/builder/subject.cpp create mode 100644 src/message/builder/subject.hpp create mode 100644 src/message/builder/text.cpp create mode 100644 src/message/builder/text.hpp create mode 100644 src/message/builder/types/idecorator.hpp create mode 100644 src/message/builder/types/imessage_builder.hpp (limited to 'src/message/builder') diff --git a/src/message/builder/cc.cpp b/src/message/builder/cc.cpp new file mode 100644 index 0000000..55d70ff --- /dev/null +++ b/src/message/builder/cc.cpp @@ -0,0 +1,31 @@ +#include "cc.hpp" + +namespace smtp::message::builder +{ + Cc::Cc( std::list const& mail_to ) + : mMailTo( mail_to ) + { + + } + + std::string Cc::Get() const + { + std::string result; + if( mBase ) + { + result = mBase->Get(); + } + + if( mMailTo.empty() ) + { + return result; + } + + for(const auto& cc : mMailTo) + { + result += "Cc: " + cc + "\r\n"; + } + + return result; + } +} diff --git a/src/message/builder/cc.hpp b/src/message/builder/cc.hpp new file mode 100644 index 0000000..340c7cd --- /dev/null +++ b/src/message/builder/cc.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "types/idecorator.hpp" +#include "types/imessage_builder.hpp" + +namespace smtp::message::builder +{ + class Cc : public types::IDecorator + { + public: + explicit Cc( std::list const& mail_to ); + ~Cc() override = default; + + std::string Get() const override; + private: + std::list const& mMailTo; + }; +} + diff --git a/src/message/builder/date.cpp b/src/message/builder/date.cpp new file mode 100644 index 0000000..3268935 --- /dev/null +++ b/src/message/builder/date.cpp @@ -0,0 +1,16 @@ +#include "date.hpp" + +namespace smtp::message::builder +{ + std::string Date::Get() const + { + std::string result; + + if( mBase ) + { + result = mBase->Get(); + } + result += "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n"; + return result; + } +} diff --git a/src/message/builder/date.hpp b/src/message/builder/date.hpp new file mode 100644 index 0000000..31908ac --- /dev/null +++ b/src/message/builder/date.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "types/idecorator.hpp" +#include "types/imessage_builder.hpp" + +namespace smtp::message::builder +{ + class Date : public types::IDecorator + { + public: + Date() = default; + ~Date() override = default; + + std::string Get() const override; + }; +} + diff --git a/src/message/builder/from.cpp b/src/message/builder/from.cpp new file mode 100644 index 0000000..b19515a --- /dev/null +++ b/src/message/builder/from.cpp @@ -0,0 +1,22 @@ +#include "from.hpp" + +namespace smtp::message::builder +{ + + From::From( std::string const& mail_to ) + :mMailTo( mail_to ) + { + + } + + std::string From::Get() const + { + std::string result; + if( mBase ) + { + result = mBase->Get(); + } + result += "From: " + mMailTo + "\r\n"; + return result; + } +} diff --git a/src/message/builder/from.hpp b/src/message/builder/from.hpp new file mode 100644 index 0000000..d1f0b21 --- /dev/null +++ b/src/message/builder/from.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "types/idecorator.hpp" +#include "types/imessage_builder.hpp" + +namespace smtp::message::builder +{ + class From : public types::IDecorator + { + public: + explicit From( std::string const& mail_to ); + ~From() override = default; + + std::string Get() const override; + private: + std::string const& mMailTo; + }; +} + diff --git a/src/message/builder/mail_to.cpp b/src/message/builder/mail_to.cpp new file mode 100644 index 0000000..dab1b7f --- /dev/null +++ b/src/message/builder/mail_to.cpp @@ -0,0 +1,23 @@ +#include "mail_to.hpp" + +namespace smtp::message::builder +{ + MailTo::MailTo( std::string const& mail_to) + : mMailTo( mail_to ) + { + + } + + std::string MailTo::Get() const + { + std::string result; + if( mBase ) + { + result = mBase->Get(); + } + + result += "To: " + mMailTo +"\r\n"; + + return result; + } +} diff --git a/src/message/builder/mail_to.hpp b/src/message/builder/mail_to.hpp new file mode 100644 index 0000000..5d60d97 --- /dev/null +++ b/src/message/builder/mail_to.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "types/idecorator.hpp" +#include "types/imessage_builder.hpp" + +namespace smtp::message::builder +{ + class MailTo : public types::IDecorator + { + public: + explicit MailTo( std::string const& mail_to ); + ~MailTo() override = default; + + std::string Get() const override; + private: + std::string const& mMailTo; + }; +} + diff --git a/src/message/builder/subject.cpp b/src/message/builder/subject.cpp new file mode 100644 index 0000000..166bca4 --- /dev/null +++ b/src/message/builder/subject.cpp @@ -0,0 +1,22 @@ +#include "subject.hpp" + +namespace smtp::message::builder +{ + Subject::Subject( std::string const& subject ) + : mSubject(subject) + { + + } + + std::string Subject::Get() const + { + std::string result; + if( mBase ) + { + result = mBase->Get(); + } + + result += "Subject: " + mSubject + "\r\n"; + return result; + } +} diff --git a/src/message/builder/subject.hpp b/src/message/builder/subject.hpp new file mode 100644 index 0000000..8153bc8 --- /dev/null +++ b/src/message/builder/subject.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "types/idecorator.hpp" +#include "types/imessage_builder.hpp" + +namespace smtp::message::builder +{ + class Subject : public types::IDecorator + { + public: + explicit Subject( std::string const& subject ); + ~Subject() override = default; + + std::string Get() const override; + private: + std::string const& mSubject; + }; +} + diff --git a/src/message/builder/text.cpp b/src/message/builder/text.cpp new file mode 100644 index 0000000..c478b7d --- /dev/null +++ b/src/message/builder/text.cpp @@ -0,0 +1,24 @@ +#include "text.hpp" + +namespace smtp::message::builder +{ + Text::Text( std::string const& text) + : mText( text ) + { + + } + + std::string Text::Get() const + { + std::string result; + if( mBase ) + { + result = mBase->Get(); + } + + result += "\r\n"; + result += mText + "\r\n"; + + return result; + } +} diff --git a/src/message/builder/text.hpp b/src/message/builder/text.hpp new file mode 100644 index 0000000..9715656 --- /dev/null +++ b/src/message/builder/text.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "types/idecorator.hpp" +#include "types/imessage_builder.hpp" + +namespace smtp::message::builder +{ + class Text : public types::IDecorator + { + public: + explicit Text( std::string const& text ); + ~Text() override = default; + + std::string Get() const override; + private: + std::string const& mText; + }; +} + diff --git a/src/message/builder/types/idecorator.hpp b/src/message/builder/types/idecorator.hpp new file mode 100644 index 0000000..19284ac --- /dev/null +++ b/src/message/builder/types/idecorator.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include + +namespace smtp::message::builder::types +{ + +/** + * @brief Базовый интерфейс описания декоратора + * @details См. https://refactoring.guru/ru/design-patterns/decorator + * @tparam T Тип декорируемого класса, T должен обладать возможностью наследования (в том числе виртуальный деструктор) + */ + template < typename T, typename TPointerType = std::shared_ptr > class IDecorator : public T + { + public: + using PointerType = TPointerType; + using Type = IDecorator; + + ~IDecorator() override = default; + + /** + * @brief Установить указатель на декорируемый класс + * @details По возможности используйте метод Apply() как наиболее универсальный + * @param base Указатель на декорируемый класс + */ + void SetBase( PointerType const& base ) noexcept + { + mBase = base; + } + + void SetBase( PointerType&& base ) noexcept + { + mBase = std::move( base ); + } + + /** + * @brief Установить указатель на декорируемый класс (цепочка обязанностей) + * @details См. https://refactoring.guru/ru/design-patterns/chain-of-responsibility/cpp/example + * @details Цепь вызовов: декоратор1 -> декоратор2 -> базовый класс + * @param base_or_decorator Указатель на декорируемый класс или целевой декоратор + */ + Type& Apply( PointerType const& base_or_decorator ) noexcept + { + if( !base_or_decorator ) + { + return *this; + } + + SetBase( base_or_decorator ); + return GetApplyResult(); + } + + Type& Apply( PointerType&& base_or_decorator ) noexcept + { + if( !base_or_decorator ) + { + return *this; + } + + SetBase( std::move( base_or_decorator ) ); + return GetApplyResult(); + } + + private: + Type& GetApplyResult() noexcept + { + auto as_decorator = dynamic_cast< Type * >( mBase.get() ); + if( as_decorator ) + { + return *as_decorator; + } + + return *this; + } + + protected: + PointerType mBase; + }; + + template < typename T, typename TDeleter = std::default_delete > using IDecoratorUnique = IDecorator >; + +} // namespace sbis::devices::generic::types diff --git a/src/message/builder/types/imessage_builder.hpp b/src/message/builder/types/imessage_builder.hpp new file mode 100644 index 0000000..701f5f9 --- /dev/null +++ b/src/message/builder/types/imessage_builder.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace smtp::message::builder::types +{ + class IMessageBuilder + { + public: + virtual ~IMessageBuilder() = default; + + virtual std::string Get() const = 0; + }; +} -- cgit v1.2.3