132 lines
3.0 KiB
C++
132 lines
3.0 KiB
C++
/*!\file
|
||
* \brief \todo Описание файла.
|
||
*/
|
||
/*
|
||
* AppBuilder.h
|
||
*
|
||
* Created on: 24 июн. 2019 г.
|
||
* Author: titov
|
||
*/
|
||
|
||
#ifndef SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_
|
||
#define SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_
|
||
|
||
#include "../../application/ISetupStep.hh"
|
||
|
||
#include "../Environment.hh"
|
||
|
||
#include "AppId.hh"
|
||
|
||
#include "../../units/LogicalEntities.hpp"
|
||
|
||
namespace configuration { namespace software {
|
||
|
||
class AppBuilder {
|
||
public:
|
||
typedef std::size_t Idx;
|
||
|
||
class BuildedItem {
|
||
|
||
friend class AppBuilder;
|
||
|
||
enum State {
|
||
INPUT,
|
||
PREPARE,
|
||
BUILD,
|
||
DONE,
|
||
ERROR,
|
||
};
|
||
|
||
application::ISetupStep * step;
|
||
State state;
|
||
InitializerStepId id;
|
||
|
||
public:
|
||
BuildedItem()
|
||
: step(nullptr),
|
||
state(INPUT),
|
||
id(-1) {}
|
||
|
||
};
|
||
|
||
AppBuilder( BuildedItem * items, std::size_t items_size,
|
||
Environment & env );
|
||
|
||
bool addState( application::ISetupStep * state, InitializerStepId id );
|
||
|
||
void process();
|
||
|
||
bool isBuilded() const;
|
||
|
||
std::size_t getSize() const { return size; }
|
||
|
||
void cancel();
|
||
|
||
virtual ~AppBuilder() = default;
|
||
protected:
|
||
virtual bool do_input( Environment & env, application::ISetupStep * & );
|
||
virtual bool do_prepare( application::ISetupStep * & );
|
||
virtual bool do_build( Environment & env, application::ISetupStep * & );
|
||
|
||
const std::size_t size;
|
||
BuildedItem * const setup_list;
|
||
|
||
Idx build_index = 0;
|
||
Idx step_quantity = 0;
|
||
Idx finish_quantity = 0;
|
||
|
||
Environment & global_env;
|
||
|
||
bool application_builded = false;
|
||
|
||
void end();
|
||
virtual bool do_end( Environment & env, application::ISetupStep * & );
|
||
|
||
|
||
|
||
};
|
||
|
||
template<std::size_t size>
|
||
struct AppBuilderBox {
|
||
AppBuilder::BuildedItem items[size];
|
||
AppBuilder builder;
|
||
|
||
AppBuilderBox( Environment & env ) :
|
||
items(), builder( items, size, env ) {}
|
||
};
|
||
|
||
}}
|
||
|
||
#include <exception>
|
||
|
||
namespace configuration { namespace software {
|
||
|
||
struct BadAppBuilderSize : public std::exception {
|
||
std::size_t item_quantity;
|
||
BadAppBuilderSize( std::size_t item_quantity ) : item_quantity(item_quantity) {}
|
||
const char* what() const noexcept { return "Bad AppBuilder size!"; }
|
||
};
|
||
|
||
inline void add( AppBuilder & builder, application::ISetupStep * step, InitializerStepId id ) {
|
||
|
||
if( not builder.addState(step, id) and step )
|
||
throw BadAppBuilderSize( builder.getSize() );
|
||
|
||
}
|
||
|
||
class AppBuilderSafety : public AppBuilder {
|
||
public:
|
||
AppBuilderSafety( BuildedItem * items, std::size_t items_size,
|
||
Environment & env ) : AppBuilder( items, items_size, env ) {}
|
||
protected:
|
||
virtual bool do_input( Environment & env, application::ISetupStep * & ) override;
|
||
virtual bool do_prepare( application::ISetupStep * & ) override;
|
||
virtual bool do_build( Environment & env, application::ISetupStep * & ) override;
|
||
virtual bool do_end( Environment & env, application::ISetupStep * & ) override;
|
||
};
|
||
|
||
}}
|
||
|
||
|
||
#endif /* SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_ */
|