| 
									
										
										
										
											2013-10-26 19:33:34 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * JsonDetail.h, part of VCMI engine | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Authors: listed in file AUTHORS in main folder | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * License: GNU General Public License v2.0 or later | 
					
						
							|  |  |  |  * Full text of license available in license.txt file, in main folder | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "JsonNode.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-26 16:07:42 +03:00
										 |  |  | VCMI_LIB_NAMESPACE_BEGIN | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-26 19:33:34 +00:00
										 |  |  | class JsonWriter | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	//prefix for each line (tabulation)
 | 
					
						
							|  |  |  | 	std::string prefix; | 
					
						
							| 
									
										
										
										
											2017-08-11 16:27:42 +03:00
										 |  |  | 	std::ostream & out; | 
					
						
							| 
									
										
										
										
											2017-09-14 13:03:44 +12:00
										 |  |  | 	//sets whether compact nodes are written in single-line format
 | 
					
						
							|  |  |  | 	bool compact; | 
					
						
							|  |  |  | 	//tracks whether we are currently using single-line format
 | 
					
						
							|  |  |  | 	bool compactMode = false; | 
					
						
							| 
									
										
										
										
											2013-10-26 19:33:34 +00:00
										 |  |  | public: | 
					
						
							|  |  |  | 	template<typename Iterator> | 
					
						
							|  |  |  | 	void writeContainer(Iterator begin, Iterator end); | 
					
						
							|  |  |  | 	void writeEntry(JsonMap::const_iterator entry); | 
					
						
							|  |  |  | 	void writeEntry(JsonVector::const_iterator entry); | 
					
						
							| 
									
										
										
										
											2017-08-11 16:27:42 +03:00
										 |  |  | 	void writeString(const std::string & string); | 
					
						
							|  |  |  | 	void writeNode(const JsonNode & node); | 
					
						
							| 
									
										
										
										
											2017-09-14 13:03:44 +12:00
										 |  |  | 	JsonWriter(std::ostream & output, bool compact = false); | 
					
						
							| 
									
										
										
										
											2013-10-26 19:33:34 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //Tiny string class that uses const char* as data for speed, members are private
 | 
					
						
							|  |  |  | //for ease of debugging and some compatibility with std::string
 | 
					
						
							|  |  |  | class constString | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	const char *data; | 
					
						
							|  |  |  | 	const size_t datasize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	constString(const char * inputString, size_t stringSize): | 
					
						
							|  |  |  | 		data(inputString), | 
					
						
							|  |  |  | 		datasize(stringSize) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	inline size_t size() const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return datasize; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	inline const char& operator[] (size_t position) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		assert (position < datasize); | 
					
						
							|  |  |  | 		return data[position]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //Internal class for string -> JsonNode conversion
 | 
					
						
							| 
									
										
										
										
											2022-06-20 17:39:50 +03:00
										 |  |  | class DLL_LINKAGE JsonParser | 
					
						
							| 
									
										
										
										
											2013-10-26 19:33:34 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	std::string errors;     // Contains description of all encountered errors
 | 
					
						
							|  |  |  | 	constString input;      // Input data
 | 
					
						
							|  |  |  | 	ui32 lineCount; // Currently parsed line, starting from 1
 | 
					
						
							|  |  |  | 	size_t lineStart;       // Position of current line start
 | 
					
						
							|  |  |  | 	size_t pos;             // Current position of parser
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//Helpers
 | 
					
						
							|  |  |  | 	bool extractEscaping(std::string &str); | 
					
						
							|  |  |  | 	bool extractLiteral(const std::string &literal); | 
					
						
							|  |  |  | 	bool extractString(std::string &string); | 
					
						
							|  |  |  | 	bool extractWhitespace(bool verbose = true); | 
					
						
							|  |  |  | 	bool extractSeparator(); | 
					
						
							|  |  |  | 	bool extractElement(JsonNode &node, char terminator); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//Methods for extracting JSON data
 | 
					
						
							|  |  |  | 	bool extractArray(JsonNode &node); | 
					
						
							|  |  |  | 	bool extractFalse(JsonNode &node); | 
					
						
							|  |  |  | 	bool extractFloat(JsonNode &node); | 
					
						
							|  |  |  | 	bool extractNull(JsonNode &node); | 
					
						
							|  |  |  | 	bool extractString(JsonNode &node); | 
					
						
							|  |  |  | 	bool extractStruct(JsonNode &node); | 
					
						
							|  |  |  | 	bool extractTrue(JsonNode &node); | 
					
						
							|  |  |  | 	bool extractValue(JsonNode &node); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//Add error\warning message to list
 | 
					
						
							|  |  |  | 	bool error(const std::string &message, bool warning=false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	JsonParser(const char * inputString, size_t stringSize); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// do actual parsing. filename is name of file that will printed to console if any errors were found
 | 
					
						
							| 
									
										
										
										
											2023-03-14 00:26:44 +03:00
										 |  |  | 	JsonNode parse(const std::string & fileName); | 
					
						
							| 
									
										
										
										
											2013-11-08 20:36:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-23 12:59:03 +00:00
										 |  |  | 	/// returns true if parsing was successful
 | 
					
						
							| 
									
										
										
										
											2013-11-08 20:36:26 +00:00
										 |  |  | 	bool isValid(); | 
					
						
							| 
									
										
										
										
											2013-10-26 19:33:34 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //Internal class for Json validation. Mostly compilant with json-schema v4 draft
 | 
					
						
							|  |  |  | namespace Validation | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/// struct used to pass data around during validation
 | 
					
						
							|  |  |  | 	struct ValidationData | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		/// path from root node to current one.
 | 
					
						
							|  |  |  | 		/// JsonNode is used as variant - either string (name of node) or as float (index in list)
 | 
					
						
							|  |  |  | 		std::vector<JsonNode> currentPath; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/// Stack of used schemas. Last schema is the one used currently.
 | 
					
						
							|  |  |  | 		/// May contain multiple items in case if remote references were found
 | 
					
						
							|  |  |  | 		std::vector<std::string> usedSchemas; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/// generates error message
 | 
					
						
							|  |  |  | 		std::string makeErrorMessage(const std::string &message); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	typedef std::function<std::string(const JsonNode &)> TFormatValidator; | 
					
						
							|  |  |  | 	typedef std::unordered_map<std::string, TFormatValidator> TFormatMap; | 
					
						
							|  |  |  | 	typedef std::function<std::string(ValidationData &, const JsonNode &, const JsonNode &, const JsonNode &)> TFieldValidator; | 
					
						
							|  |  |  | 	typedef std::unordered_map<std::string, TFieldValidator> TValidatorMap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// map of known fields in schema
 | 
					
						
							|  |  |  | 	const TValidatorMap & getKnownFieldsFor(JsonNode::JsonType type); | 
					
						
							|  |  |  | 	const TFormatMap & getKnownFormats(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-14 00:26:44 +03:00
										 |  |  | 	std::string check(const std::string & schemaName, const JsonNode & data); | 
					
						
							|  |  |  | 	std::string check(const std::string & schemaName, const JsonNode & data, ValidationData & validator); | 
					
						
							| 
									
										
										
										
											2013-10-26 19:33:34 +00:00
										 |  |  | 	std::string check(const JsonNode & schema, const JsonNode & data, ValidationData & validator); | 
					
						
							| 
									
										
										
										
											2013-11-08 20:36:26 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-07-26 16:07:42 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | VCMI_LIB_NAMESPACE_END |