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"
16#include "ObjectReader.h"
21using namespace Stroika::Foundation::DataExchange::StructuredStreamEvents;
37shared_ptr<IElementConsumer> IElementConsumer::HandleChildStart ([[maybe_unused]]
const Name& name)
60void Registry::SimpleReader_<String>::Deactivating ()
62 *fValue_ = fBuf_.str ();
66void Registry::SimpleReader_<char>::Deactivating ()
68 *fValue_ = Characters::String2Int<char> (fBuf_.str ());
72void Registry::SimpleReader_<unsigned char>::Deactivating ()
74 *fValue_ = Characters::String2Int<unsigned char> (fBuf_.str ());
78void Registry::SimpleReader_<short>::Deactivating ()
80 *fValue_ = Characters::String2Int<short> (fBuf_.str ());
84void Registry::SimpleReader_<unsigned short>::Deactivating ()
86 *fValue_ = Characters::String2Int<unsigned short> (fBuf_.str ());
90void Registry::SimpleReader_<int>::Deactivating ()
92 *fValue_ = Characters::String2Int<int> (fBuf_.str ());
96void Registry::SimpleReader_<unsigned int>::Deactivating ()
98 *fValue_ = Characters::String2Int<unsigned int> (fBuf_.str ());
102void Registry::SimpleReader_<long int>::Deactivating ()
104 *fValue_ = Characters::String2Int<long int> (fBuf_.str ());
108void Registry::SimpleReader_<unsigned long int>::Deactivating ()
110 *fValue_ = Characters::String2Int<unsigned long int> (fBuf_.str ());
114void Registry::SimpleReader_<long long int>::Deactivating ()
116 *fValue_ = Characters::String2Int<long long int> (fBuf_.str ());
120void Registry::SimpleReader_<unsigned long long int>::Deactivating ()
122 *fValue_ = Characters::String2Int<unsigned long long int> (fBuf_.str ());
126void Registry::SimpleReader_<bool>::Deactivating ()
128 *fValue_ = (fBuf_.str ().ToLowerCase () ==
"true"sv);
132void Registry::SimpleReader_<float>::Deactivating ()
134 (*fValue_) = Characters::FloatConversion::ToFloat<float> (fBuf_.str ());
138void Registry::SimpleReader_<double>::Deactivating ()
140 (*fValue_) = Characters::FloatConversion::ToFloat<double> (fBuf_.str ());
144void Registry::SimpleReader_<long double>::Deactivating ()
146 (*fValue_) = Characters::FloatConversion::ToFloat<long double> (fBuf_.str ());
150void Registry::SimpleReader_<IO::Network::URI>::Deactivating ()
157void Registry::SimpleReader_<Time::DateTime>::Deactivating ()
160 IgnoreExceptionsForCall (*fValue_ = Time::DateTime::Parse (fBuf_.str (), Time::DateTime::kISO8601Format));
164void Registry::SimpleReader_<Time::Duration>::Deactivating ()
167 IgnoreExceptionsForCall (*fValue_ =
Time::Duration{fBuf_.str ()});
177 return shared_from_this ();
185Context::Context (
const Registry& registry,
const shared_ptr<IElementConsumer>& initialTop)
186 : fObjectReaderRegistry_ (registry)
191#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
192String Context::TraceLeader_ ()
const
194 static const String kOneTabLevel_{
" "sv};
195 return kOneTabLevel_.
Repeat (
static_cast<unsigned int> (fStack_.size ()));
207#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
208 if (fContext.fTraceThisReader) {
209 DbgTrace (
"{}Calling IConsumerDelegateToContext::HandleChildStart ('{}')..."_f, fContext.TraceLeader_ (), name.fLocalName);
212 shared_ptr<IElementConsumer> eltToPush = fContext.GetTop ()->HandleChildStart (name);
214 fContext.Push (eltToPush);
216 for (
auto attr : attributes) {
226#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
227 if (fContext.fTraceThisReader) {
228 DbgTrace (
"{}Calling IConsumerDelegateToContext::EndElement ('{}')..."_f, fContext.TraceLeader_ (), name.fLocalName);
236#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
237 if (fContext.fTraceThisReader) {
238 DbgTrace (
"{}Calling IConsumerDelegateToContext::TextInsideElement ('{}')..."_f, fContext.TraceLeader_ (), text.
LimitLength (50));
241 fContext.GetTop ()->HandleTextInside (text);
249ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader)
250 : fReader2Delegate2_ (theUseReader)
255ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& tagToHandOff)
256 : fReader2Delegate2_ (theUseReader)
257 , fTagToHandOff_ (tagToHandOff)
262ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& contextTag,
const Name& tagToHandOff)
268ReadDownToReader::ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& contextTag1,
const Name& contextTag2,
const Name& tagToHandOff)
274shared_ptr<IElementConsumer> ReadDownToReader::HandleChildStart (
const Name& name)
276 if (not fTagToHandOff_.has_value () or *fTagToHandOff_ == name) {
277 return fReader2Delegate2_;
280 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...