4#include "Stroika/Foundation/StroikaPreComp.h"
7#include "Stroika/Foundation/Characters/FloatConversion.h"
9#include "Stroika/Foundation/Characters/String2Int.h"
10#include "Stroika/Foundation/DataExchange/BadFormatException.h"
17#include "ObjectReader.h"
22using namespace Stroika::Foundation::DataExchange::StructuredStreamEvents;
25using Memory::MakeSharedPtr;
39shared_ptr<IElementConsumer> IElementConsumer::HandleChildStart ([[maybe_unused]]
const Name& name)
62void Registry::SimpleReader_<String>::Deactivating ()
64 *fValue_ = fBuf_.str ();
68void Registry::SimpleReader_<char>::Deactivating ()
70 *fValue_ = Characters::String2Int<char> (fBuf_.str ());
74void Registry::SimpleReader_<unsigned char>::Deactivating ()
76 *fValue_ = Characters::String2Int<unsigned char> (fBuf_.str ());
80void Registry::SimpleReader_<short>::Deactivating ()
82 *fValue_ = Characters::String2Int<short> (fBuf_.str ());
86void Registry::SimpleReader_<unsigned short>::Deactivating ()
88 *fValue_ = Characters::String2Int<unsigned short> (fBuf_.str ());
92void Registry::SimpleReader_<int>::Deactivating ()
94 *fValue_ = Characters::String2Int<int> (fBuf_.str ());
98void Registry::SimpleReader_<unsigned int>::Deactivating ()
100 *fValue_ = Characters::String2Int<unsigned int> (fBuf_.str ());
104void Registry::SimpleReader_<long int>::Deactivating ()
106 *fValue_ = Characters::String2Int<long int> (fBuf_.str ());
110void Registry::SimpleReader_<unsigned long int>::Deactivating ()
112 *fValue_ = Characters::String2Int<unsigned long int> (fBuf_.str ());
116void Registry::SimpleReader_<long long int>::Deactivating ()
118 *fValue_ = Characters::String2Int<long long int> (fBuf_.str ());
122void Registry::SimpleReader_<unsigned long long int>::Deactivating ()
124 *fValue_ = Characters::String2Int<unsigned long long int> (fBuf_.str ());
128void Registry::SimpleReader_<bool>::Deactivating ()
130 *fValue_ = (fBuf_.str ().ToLowerCase () ==
"true"sv);
134void Registry::SimpleReader_<float>::Deactivating ()
136 (*fValue_) = Characters::FloatConversion::ToFloat<float> (fBuf_.str ());
140void Registry::SimpleReader_<double>::Deactivating ()
142 (*fValue_) = Characters::FloatConversion::ToFloat<double> (fBuf_.str ());
146void Registry::SimpleReader_<long double>::Deactivating ()
148 (*fValue_) = Characters::FloatConversion::ToFloat<long double> (fBuf_.str ());
152void Registry::SimpleReader_<IO::Network::URI>::Deactivating ()
159void Registry::SimpleReader_<Time::DateTime>::Deactivating ()
162 IgnoreExceptionsForCall (*fValue_ = Time::DateTime::Parse (fBuf_.str (), Time::DateTime::kISO8601Format));
166void Registry::SimpleReader_<Time::Duration>::Deactivating ()
169 IgnoreExceptionsForCall (*fValue_ =
Time::Duration{fBuf_.str ()});
179 return shared_from_this ();
187Context::Context (
const Registry& registry,
const shared_ptr<IElementConsumer>& initialTop)
188 : fObjectReaderRegistry_ (registry)
193#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
194String Context::TraceLeader_ ()
const
196 static const String kOneTabLevel_{
" "sv};
197 return kOneTabLevel_.
Repeat (
static_cast<unsigned int> (fStack_.size ()));
209#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
210 if (fContext.fTraceThisReader) {
211 DbgTrace (
"{}Calling IConsumerDelegateToContext::HandleChildStart ('{}')..."_f, fContext.TraceLeader_ (), name.fLocalName);
214 shared_ptr<IElementConsumer> eltToPush = fContext.GetTop ()->HandleChildStart (name);
216 fContext.Push (eltToPush);
218 for (
auto attr : attributes) {
228#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
229 if (fContext.fTraceThisReader) {
230 DbgTrace (
"{}Calling IConsumerDelegateToContext::EndElement ('{}')..."_f, fContext.TraceLeader_ (), name.fLocalName);
238#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
239 if (fContext.fTraceThisReader) {
240 DbgTrace (
"{}Calling IConsumerDelegateToContext::TextInsideElement ('{}')..."_f, fContext.TraceLeader_ (), text.
LimitLength (50));
243 fContext.GetTop ()->HandleTextInside (text);
251ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader)
252 : fReader2Delegate2_ (theUseReader)
257ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& tagToHandOff)
258 : fReader2Delegate2_ (theUseReader)
259 , fTagToHandOff_ (tagToHandOff)
264ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& contextTag,
const Name& tagToHandOff)
270ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& contextTag1,
const Name& contextTag2,
const Name& tagToHandOff)
276shared_ptr<IElementConsumer> ReadDownToReader::HandleChildStart (
const Name& name)
278 if (not fTagToHandOff_.has_value () or *fTagToHandOff_ == name) {
279 return fReader2Delegate2_;
282 return shared_from_this ();
#define RequireNotNull(p)
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual String Repeat(unsigned int count) const
nonvirtual String LimitLength(size_t maxLen, StringShorteningPreference keepPref=StringShorteningPreference::ePreferKeepLeft) const
return the first maxLen (or fewer if string shorter) characters of this string (adding ellipsis if tr...
virtual void Activated(Context &r)
virtual void HandleTextInside(const String &text)
virtual void Deactivating()
virtual void EndElement(const Name &name) override
virtual void StartElement(const Name &name, const Mapping< Name, String > &attributes) override
virtual void TextInsideElement(const String &text) override
static URI Parse(const String &rawURL)
Duration is a chrono::duration<double> (=.
Create a format-string (see std::wformat_string or Stroika FormatString, or python 'f' strings.
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...