#pragma once #include #include #include #include #include "../Streams/Stream.hpp" #include "../TextStreams/TextWriter.hpp" #include "Json.hpp" namespace Tesses::Framework::Serialization::Bencode { class BeArray; class BeDictionary; class BeString; using BeUndefined = std::monostate; using BeToken = std::variant; class BeArray { public: std::vector tokens; }; class BeDictionary { public: std::vector> tokens; BeToken GetValue(BeString key) const; void SetValue(BeString key, BeToken value); }; class BeString { public: BeString(); BeString(const std::string& text); BeString(const char* text); BeString(const std::vector& data); std::vector data; operator std::string() const; }; bool operator==(const BeString& lStr, const BeString& rStr); bool operator==(const BeString& lStr, const std::string& rStr); bool operator==(const std::string& lStr, const BeString& rStr); bool operator==(const BeString& lStr, const char* rStr); bool operator==(const char* lStr, const BeString& rStr); bool operator!=(const BeString& lStr, const BeString& rStr); bool operator!=(const BeString& lStr, const std::string& rStr); bool operator!=(const std::string& lStr, const BeString& rStr); bool operator!=(const BeString& lStr, const char* rStr); bool operator!=(const char* lStr, const BeString& rStr); class Bencode { public: static void Save(std::shared_ptr strm,const BeToken& value); static BeToken Load(std::shared_ptr strm); //This cannot be converted back to torrent, this may (probably will) be out of order static Json::JToken ToJson(const BeToken& tkn); //This may (probably will) be out of order static void Print(std::shared_ptr writer, BeToken tkn); }; }