//this file is generated by program(drogon_ctl) automatically,don't modify it!
#include "cmake.h"
#include <drogon/utils/OStringStream.h>
#include <drogon/utils/Utilities.h>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <list>
#include <deque>
#include <queue>
using namespace drogon;
std::string cmake::genText(const DrTemplateData& cmake_view_data)
{
	drogon::OStringStream cmake_tmp_stream;
	std::string layoutName{""};
	cmake_tmp_stream << "cmake_minimum_required(VERSION 3.5)\n";
	cmake_tmp_stream << "project(";
{
    auto & val=cmake_view_data["ProjectName"];
    if(val.type()==typeid(const char *)){
        cmake_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        cmake_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	cmake_tmp_stream << " CXX)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "include(CheckIncludeFileCXX)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "check_include_file_cxx(any HAS_ANY)\n";
	cmake_tmp_stream << "check_include_file_cxx(string_view HAS_STRING_VIEW)\n";
	cmake_tmp_stream << "check_include_file_cxx(coroutine HAS_COROUTINE)\n";
	cmake_tmp_stream << "if (NOT \"${CMAKE_CXX_STANDARD}\" STREQUAL \"\")\n";
	cmake_tmp_stream << "    # Do nothing\n";
	cmake_tmp_stream << "elseif (HAS_ANY AND HAS_STRING_VIEW AND HAS_COROUTINE)\n";
	cmake_tmp_stream << "    set(CMAKE_CXX_STANDARD 20)\n";
	cmake_tmp_stream << "elseif (HAS_ANY AND HAS_STRING_VIEW)\n";
	cmake_tmp_stream << "    set(CMAKE_CXX_STANDARD 17)\n";
	cmake_tmp_stream << "else ()\n";
	cmake_tmp_stream << "    set(CMAKE_CXX_STANDARD 14)\n";
	cmake_tmp_stream << "endif ()\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "set(CMAKE_CXX_STANDARD_REQUIRED ON)\n";
	cmake_tmp_stream << "set(CMAKE_CXX_EXTENSIONS OFF)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "add_executable(${PROJECT_NAME} main.cc)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "# ##############################################################################\n";
	cmake_tmp_stream << "# If you include the drogon source code locally in your project, use this method\n";
	cmake_tmp_stream << "# to add drogon \n";
	cmake_tmp_stream << "# add_subdirectory(drogon) \n";
	cmake_tmp_stream << "# target_link_libraries(${PROJECT_NAME} PRIVATE drogon)\n";
	cmake_tmp_stream << "#\n";
	cmake_tmp_stream << "# and comment out the following lines\n";
	cmake_tmp_stream << "find_package(Drogon CONFIG REQUIRED)\n";
	cmake_tmp_stream << "target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "# ##############################################################################\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "if (CMAKE_CXX_STANDARD LESS 17)\n";
	cmake_tmp_stream << "    message(FATAL_ERROR \"c++17 or higher is required\")\n";
	cmake_tmp_stream << "elseif (CMAKE_CXX_STANDARD LESS 20)\n";
	cmake_tmp_stream << "    message(STATUS \"use c++17\")\n";
	cmake_tmp_stream << "else ()\n";
	cmake_tmp_stream << "    message(STATUS \"use c++20\")\n";
	cmake_tmp_stream << "endif ()\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "aux_source_directory(controllers CTL_SRC)\n";
	cmake_tmp_stream << "aux_source_directory(filters FILTER_SRC)\n";
	cmake_tmp_stream << "aux_source_directory(plugins PLUGIN_SRC)\n";
	cmake_tmp_stream << "aux_source_directory(models MODEL_SRC)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "drogon_create_views(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/views\n";
	cmake_tmp_stream << "                    ${CMAKE_CURRENT_BINARY_DIR})\n";
	cmake_tmp_stream << "# use the following line to create views with namespaces.\n";
	cmake_tmp_stream << "# drogon_create_views(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/views\n";
	cmake_tmp_stream << "#                     ${CMAKE_CURRENT_BINARY_DIR} TRUE)\n";
	cmake_tmp_stream << "# use the following line to create views with namespace CHANGE_ME prefixed\n";
	cmake_tmp_stream << "# and path namespaces.\n";
	cmake_tmp_stream << "# drogon_create_views(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/views\n";
	cmake_tmp_stream << "#                     ${CMAKE_CURRENT_BINARY_DIR} TRUE CHANGE_ME)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "target_include_directories(${PROJECT_NAME}\n";
	cmake_tmp_stream << "                           PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}\n";
	cmake_tmp_stream << "                                   ${CMAKE_CURRENT_SOURCE_DIR}/models)\n";
	cmake_tmp_stream << "target_sources(${PROJECT_NAME}\n";
	cmake_tmp_stream << "               PRIVATE\n";
	cmake_tmp_stream << "               ${SRC_DIR}\n";
	cmake_tmp_stream << "               ${CTL_SRC}\n";
	cmake_tmp_stream << "               ${FILTER_SRC}\n";
	cmake_tmp_stream << "               ${PLUGIN_SRC}\n";
	cmake_tmp_stream << "               ${MODEL_SRC})\n";
	cmake_tmp_stream << "# ##############################################################################\n";
	cmake_tmp_stream << "# uncomment the following line for dynamically loading views \n";
	cmake_tmp_stream << "# set_property(TARGET ${PROJECT_NAME} PROPERTY ENABLE_EXPORTS ON)\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "# ##############################################################################\n";
cmake_tmp_stream<<"\n";
	cmake_tmp_stream << "add_subdirectory(test)\n";
if(layoutName.empty())
{
std::string ret{std::move(cmake_tmp_stream.str())};
return ret;
}else
{
auto templ = DrTemplateBase::newTemplate(layoutName);
if(!templ) return "";
HttpViewData data = cmake_view_data;
auto str = std::move(cmake_tmp_stream.str());
if(!str.empty() && str[str.length()-1] == '\n') str.resize(str.length()-1);
data[""] = std::move(str);
return templ->genText(data);
}
}
