mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-10 06:49:28 -05:00
chore: parse includes and assetlists while parsing zone definition
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
Reference in New Issue
Block a user