chore: parse includes and assetlists while parsing zone definition

This commit is contained in:
Jan
2025-01-01 18:13:23 +01:00
parent 9852f52a15
commit aa212e0958
74 changed files with 530 additions and 437 deletions

View File

@ -3,7 +3,7 @@
#include "Parsing/ParsingException.h"
#include <filesystem>
#include <sstream>
#include <format>
namespace fs = std::filesystem;
@ -81,11 +81,7 @@ bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, const u
const auto filename = line.m_line.substr(filenameStart, filenameEnd - filenameStart);
if (!m_stream->IncludeFile(filename))
{
std::ostringstream errorStr;
errorStr << "Could not include file \"" << filename << "\"";
throw ParsingException(CreatePos(line, currentPos), errorStr.str());
}
throw ParsingException(CreatePos(line, currentPos), std::format("Could not include file \"{}\"", filename));
return true;
}

View File

@ -17,14 +17,14 @@ ParserMultiInputStream::FileInfo::FileInfo(std::istream& stream, std::string fil
{
}
ParserMultiInputStream::ParserMultiInputStream(std::unique_ptr<std::istream> stream, std::string fileName, include_callback_t includeCallback)
: m_include_callback(std::move(includeCallback))
ParserMultiInputStream::ParserMultiInputStream(std::unique_ptr<std::istream> stream, std::string fileName, IInclusionCallback& includeCallback)
: m_include_callback(includeCallback)
{
m_files.emplace(std::move(stream), std::move(fileName));
}
ParserMultiInputStream::ParserMultiInputStream(std::istream& stream, std::string fileName, include_callback_t includeCallback)
: m_include_callback(std::move(includeCallback))
ParserMultiInputStream::ParserMultiInputStream(std::istream& stream, std::string fileName, IInclusionCallback& includeCallback)
: m_include_callback(includeCallback)
{
m_files.emplace(stream, std::move(fileName));
}
@ -76,10 +76,7 @@ ParserLine ParserMultiInputStream::NextLine()
bool ParserMultiInputStream::IncludeFile(const std::string& filename)
{
if (!m_include_callback)
return false;
auto newFile = m_include_callback(filename, m_files.empty() ? "" : *m_files.top().m_file_path);
auto newFile = m_include_callback.OpenIncludedFile(filename, m_files.empty() ? "" : *m_files.top().m_file_path);
if (!newFile)
return false;

View File

@ -7,10 +7,25 @@
#include <memory>
#include <stack>
class IInclusionCallback
{
public:
virtual ~IInclusionCallback() = default;
virtual std::unique_ptr<std::istream> OpenIncludedFile(const std::string& filename, const std::string& sourceFile) = 0;
};
class ParserMultiInputStream final : public IParserLineStream
{
public:
using include_callback_t = std::function<std::unique_ptr<std::istream>(const std::string& filename, const std::string& sourceFile)>;
ParserMultiInputStream(std::unique_ptr<std::istream> stream, std::string fileName, IInclusionCallback& includeCallback);
ParserMultiInputStream(std::istream& stream, std::string fileName, IInclusionCallback& includeCallback);
ParserLine NextLine() override;
bool IncludeFile(const std::string& filename) override;
void PopCurrentFile() override;
_NODISCARD bool IsOpen() const override;
_NODISCARD bool Eof() const override;
private:
class FileInfo
@ -25,16 +40,6 @@ private:
FileInfo(std::istream& stream, std::string filePath);
};
const include_callback_t m_include_callback;
IInclusionCallback& m_include_callback;
std::stack<FileInfo> m_files;
public:
ParserMultiInputStream(std::unique_ptr<std::istream> stream, std::string fileName, include_callback_t includeCallback);
ParserMultiInputStream(std::istream& stream, std::string fileName, include_callback_t includeCallback);
ParserLine NextLine() override;
bool IncludeFile(const std::string& filename) override;
void PopCurrentFile() override;
_NODISCARD bool IsOpen() const override;
_NODISCARD bool Eof() const override;
};