ZFFramework
 
Loading...
Searching...
No Matches
ZFSerializableUtil.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_ZFSerializableUtil_h_
7#define _ZFI_ZFSerializableUtil_h_
8
9#include "ZFSerializable.h"
10#include "ZFOutputDefault.h"
13
14
17#define ZFSerializableUtilErrorOccurredAt(outErrorHint, outErrorPos, errorPos, fmt, ...) \
18 ZFSerializableUtil::_ZFP_errorOccurredAt(outErrorHint, outErrorPos, errorPos, zfstr(fmt, ##__VA_ARGS__))
19
22#define ZFSerializableUtilErrorOccurred(outErrorHint, fmt, ...) \
23 ZFSerializableUtil::_ZFP_errorOccurred(outErrorHint, zfstr(fmt, ##__VA_ARGS__))
24
25extern ZFLIB_ZFCore void _ZFP_errorOccurredAt(
26 ZF_OUT_OPT zfstring *outErrorHint
27 , ZF_OUT_OPT ZFSerializableData *outErrorPos
28 , ZF_IN const ZFSerializableData &errorPos
29 , ZF_IN const zfstring &text
30 );
31extern ZFLIB_ZFCore void _ZFP_errorOccurred(
32 ZF_OUT_OPT zfstring *outErrorHint
33 , ZF_IN const zfstring &text
34 );
35
43 ZF_IN const ZFSerializableData &serializableData
44 , ZF_IN const zfstring &desiredClass
45 );
50 ZF_IN const ZFSerializableData &serializableData
51 , ZF_IN const zfstring &desiredClass
52 , ZF_OUT_OPT zfstring *outErrorHint = zfnull
53 , ZF_OUT_OPT ZFSerializableData *outErrorPos = zfnull
54 );
55
63 ZF_IN const ZFSerializableData &serializableData
64 , ZF_IN const zfstring &desiredAttr
65 );
71 ZF_IN const ZFSerializableData &serializableData
72 , ZF_IN const zfstring &desiredAttr
73 , ZF_OUT_OPT zfstring *outErrorHint = zfnull
74 , ZF_OUT_OPT ZFSerializableData *outErrorPos = zfnull
75 );
76
82 ZF_IN const ZFSerializableData &serializableData
83 , ZF_IN const zfstring &desiredElementName
84 );
90 ZF_IN const ZFSerializableData &serializableData
91 , ZF_IN const zfstring &desiredElementName
92 , ZF_OUT_OPT zfstring *outErrorHint = zfnull
93 , ZF_OUT_OPT ZFSerializableData *outErrorPos = zfnull
94 );
95
101 ZF_IN const ZFSerializableData &serializableData
102 , ZF_IN const zfstring &desiredElementCategory
103 );
109 ZF_IN const ZFSerializableData &serializableData
110 , ZF_IN const zfstring &desiredElementCategory
111 , ZF_OUT_OPT zfstring *outErrorHint = zfnull
112 , ZF_OUT_OPT ZFSerializableData *outErrorPos = zfnull
113 );
114
119inline zfstring checkPropertyName(ZF_IN const ZFSerializableData &serializableData) {
121}
122
127 ZF_IN const ZFSerializableData &serializableData
128 , ZF_OUT_OPT zfstring *outErrorHint = zfnull
129 , ZF_OUT_OPT ZFSerializableData *outErrorPos = zfnull
130 ) {
131 return ZFSerializableUtil::requireAttr(serializableData, ZFSerializableKeyword_prop, outErrorHint, outErrorPos);
132}
133
138inline zfstring checkPropertyValue(ZF_IN const ZFSerializableData &serializableData) {
140}
141
146 ZF_IN const ZFSerializableData &serializableData
147 , ZF_OUT_OPT zfstring *outErrorHint = zfnull
148 , ZF_OUT_OPT ZFSerializableData *outErrorPos = zfnull
149 ) {
150 return ZFSerializableUtil::requireAttr(serializableData, ZFSerializableKeyword_value, outErrorHint, outErrorPos);
151}
152
157inline zfstring checkCategory(ZF_IN const ZFSerializableData &serializableData) {
159}
160
165 ZF_IN const ZFSerializableData &serializableData
166 , ZF_OUT_OPT zfstring *outErrorHint = zfnull
167 , ZF_OUT_OPT ZFSerializableData *outErrorPos = zfnull
168 ) {
169 return ZFSerializableUtil::requireAttr(serializableData, ZFSerializableKeyword_category, outErrorHint, outErrorPos);
170}
171
179 ZF_IN const ZFSerializableData &serializableData
180 , ZF_IN_OPT const ZFOutput &outputCallback = ZFOutputDefault()
181 );
182
183// ============================================================
184// util macro for impl
185#define _ZFP_ZFSerializableUtilSerializeFromData_check(outErrorHint, outErrorPos)
186#define _ZFP_ZFSerializableUtilSerializeFromData_require(outErrorHint, outErrorPos) , outErrorHint, outErrorPos
187#define _ZFP_ZFSerializableUtilSerializeFromData_(check_or_require, outErrorHint, outErrorPos) \
188 _ZFP_ZFSerializableUtilSerializeFromData_##check_or_require(outErrorHint, outErrorPos)
189#define _ZFP_ZFSerializableUtilSerializeFromData(check_or_require, outErrorHint, outErrorPos) \
190 _ZFP_ZFSerializableUtilSerializeFromData_(check_or_require, outErrorHint, outErrorPos)
191
193#define ZFSerializableUtilSerializeAttrFromData(serializableData, outErrorHint, outErrorPos, \
194 check_or_require, key, TypeName, value, failAction) \
195 do { \
196 zfstring valueString = ZFSerializableUtil::check_or_require##Attr(serializableData, key \
197 _ZFP_ZFSerializableUtilSerializeFromData(check_or_require, outErrorHint, outErrorPos)); \
198 if(valueString != zfnull) { \
199 if(!TypeName##FromStringT(value, valueString)) { \
200 ZFSerializableUtilErrorOccurredAt(outErrorHint, outErrorPos, serializableData, \
201 "failed to convert from \"%s\"", valueString); \
202 failAction \
203 } \
204 } \
205 } while(zffalse)
207#define ZFSerializableUtilSerializeAttrToData(serializableData, outErrorHint, ref, \
208 key, TypeName, thisValue, refData, defaultValue, failAction) \
209 do { \
210 if((ref == zfnull && ZFComparerDefault(thisValue, defaultValue) != ZFCompareEqual) \
211 || (ref != zfnull && ZFComparerDefault(thisValue, refData) != ZFCompareEqual) \
212 ) { \
213 zfstring valueString; \
214 if(!TypeName##ToStringT(valueString, thisValue)) { \
215 ZFSerializableUtilErrorOccurred(outErrorHint, \
216 "failed to convert %s to string", key); \
217 failAction \
218 } \
219 else { \
220 serializableData.attr(key, valueString); \
221 } \
222 } \
223 } while(zffalse)
225#define ZFSerializableUtilSerializeAttrToDataNoRef(serializableData, outErrorHint, \
226 key, TypeName, thisValue, defaultValue, failAction) \
227 do { \
228 if(ZFComparerDefault(thisValue, defaultValue) != ZFCompareEqual) { \
229 zfstring valueString; \
230 if(!TypeName##ToStringT(valueString, thisValue)) { \
231 ZFSerializableUtilErrorOccurred(outErrorHint, \
232 "failed to convert %s to string", key); \
233 failAction \
234 } \
235 else { \
236 serializableData.attr(key, valueString); \
237 } \
238 } \
239 } while(zffalse)
240
241// ============================================================
243#define ZFSerializableUtilSerializeCategoryFromData(serializableData, outErrorHint, outErrorPos, \
244 check_or_require, key, TypeName, value, failAction) \
245 do { \
246 ZFSerializableData valueData = ZFSerializableUtil::check_or_require##ElementByCategory(serializableData, key \
247 _ZFP_ZFSerializableUtilSerializeFromData(check_or_require, outErrorHint, outErrorPos)); \
248 if(valueData != zfnull) { \
249 if(!TypeName##FromDataT(value, valueData, outErrorHint, outErrorPos)) { \
250 failAction \
251 } \
252 } \
253 } while(zffalse)
255#define ZFSerializableUtilSerializeCategoryToData(serializableData, outErrorHint, ref, \
256 key, TypeName, thisValue, refData, defaultValue, failAction) \
257 do { \
258 if((ref == zfnull && ZFComparerDefault(thisValue, defaultValue) != ZFCompareEqual) \
259 || (ref != zfnull && ZFComparerDefault(thisValue, refData) != ZFCompareEqual) \
260 ) { \
261 ZFSerializableData categoryData; \
262 if(!TypeName##ToDataT(categoryData, thisValue, outErrorHint)) { \
263 failAction \
264 } \
265 else { \
266 categoryData.category(key); \
267 serializableData.child(categoryData); \
268 } \
269 } \
270 } while(zffalse)
272#define ZFSerializableUtilSerializeCategoryToDataNoRef(serializableData, outErrorHint, \
273 key, TypeName, thisValue, defaultValue, failAction) \
274 do { \
275 if(ZFComparerDefault(thisValue, defaultValue) != ZFCompareEqual) { \
276 ZFSerializableData categoryData; \
277 if(!TypeName##ToDataT(categoryData, thisValue, outErrorHint)) { \
278 failAction \
279 } \
280 else { \
281 categoryData.category(key); \
282 serializableData.child(categoryData); \
283 } \
284 } \
285 } while(zffalse)
286
289#endif // #ifndef _ZFI_ZFSerializableUtil_h_
290
#define ZFLIB_ZFCore
used to export symbols
Definition ZFCoreEnvDef.h:30
#define ZF_OUT_OPT
dummy macro that shows the param used as optional output
Definition ZFCoreTypeDef_ClassType.h:192
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:180
#define ZF_IN_OPT
dummy macro that shows the param used as optional input
Definition ZFCoreTypeDef_ClassType.h:184
_ZFT_t_zfbool zfbool
bool type
Definition ZFCoreTypeDef_CoreType.h:103
#define zfnull
same as NULL, defined for future use
Definition ZFCoreTypeDef_CoreType.h:88
zft_zfstring< zfchar > zfstring
see zft_zfstring
Definition ZFCoreTypeDef_StringType.h:15
#define ZF_NAMESPACE_BEGIN_REGISTER(NameSpace, ParentNameSpace)
begin and register namespace
Definition ZFNamespace.h:48
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_END(NameSpace)
end namespace
Definition ZFNamespace.h:60
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
#define ZF_NAMESPACE_GLOBAL
namespace of ZFFramework
Definition ZFNamespace.h:96
default callback for output
const ZFOutput & ZFOutputDefault(void)
default output callback, output source must be zfchar *string
serializable interface
#define ZFSerializableKeyword_value
keyword for ZFSerializable to hold attribute or property's value, see ZFSerializableData::propertyVal...
Definition ZFSerializableData.h:48
#define ZFSerializableKeyword_prop
keyword for ZFSerializable to hold attribute or property's name, see ZFSerializableData::propertyName
Definition ZFSerializableData.h:43
#define ZFSerializableKeyword_category
keyword for ZFSerializable's to hold category, see ZFSerializableData::category
Definition ZFSerializableData.h:53
general output callback
Definition ZFIOCallback_output.h:37
ZFSerializable's data container, see ZFSerializable.
Definition ZFSerializableData.h:74
Definition ZFSerializableUtil.h:12
zfstring checkPropertyValue(const ZFSerializableData &serializableData)
util to check whether the serializable data contains property value attribute, auto mark as resolved
Definition ZFSerializableUtil.h:138
ZFSerializableData requireElementByCategory(const ZFSerializableData &serializableData, const zfstring &desiredElementCategory, zfstring *outErrorHint=zft_zfnull, ZFSerializableData *outErrorPos=zft_zfnull)
see checkElementByCategory, output error hint if failed, auto mark category as resolved
zfstring checkPropertyName(const ZFSerializableData &serializableData)
util to check whether the serializable data contains property name attribute, auto mark as resolved
Definition ZFSerializableUtil.h:119
zfstring requireItemClass(const ZFSerializableData &serializableData, const zfstring &desiredClass, zfstring *outErrorHint=zft_zfnull, ZFSerializableData *outErrorPos=zft_zfnull)
see checkItemClass, output error hint if failed
zfstring checkAttr(const ZFSerializableData &serializableData, const zfstring &desiredAttr)
util to check whether the serializable data contains desired attribute, auto mark as resolved
ZFSerializableData checkElementByCategory(const ZFSerializableData &serializableData, const zfstring &desiredElementCategory)
util to check whether the serializable data contains desired element, auto mark category as resolved
zfstring checkItemClass(const ZFSerializableData &serializableData, const zfstring &desiredClass)
util to check whether the serializable data contains desired attribute
zfbool printResolveStatus(const ZFSerializableData &serializableData, const ZFOutput &outputCallback=ZFOutputDefault())
util method to print resolve status of ZFSerializableData, for debug use only, output nothing if all ...
zfstring requireAttr(const ZFSerializableData &serializableData, const zfstring &desiredAttr, zfstring *outErrorHint=zft_zfnull, ZFSerializableData *outErrorPos=zft_zfnull)
see checkAttr, output error hint if failed, auto mark as resolved
zfstring requireCategory(const ZFSerializableData &serializableData, zfstring *outErrorHint=zft_zfnull, ZFSerializableData *outErrorPos=zft_zfnull)
see checkCategory, output error hint if failed, auto mark as resolved
Definition ZFSerializableUtil.h:164
zfstring requirePropertyName(const ZFSerializableData &serializableData, zfstring *outErrorHint=zft_zfnull, ZFSerializableData *outErrorPos=zft_zfnull)
see checkPropertyName, output error hint if failed, auto mark as resolved
Definition ZFSerializableUtil.h:126
ZFSerializableData requireElementByName(const ZFSerializableData &serializableData, const zfstring &desiredElementName, zfstring *outErrorHint=zft_zfnull, ZFSerializableData *outErrorPos=zft_zfnull)
see checkElementByName, output error hint if failed, auto mark name as resolved
zfstring requirePropertyValue(const ZFSerializableData &serializableData, zfstring *outErrorHint=zft_zfnull, ZFSerializableData *outErrorPos=zft_zfnull)
see checkPropertyValue, output error hint if failed, auto mark as resolved
Definition ZFSerializableUtil.h:145
ZFSerializableData checkElementByName(const ZFSerializableData &serializableData, const zfstring &desiredElementName)
util to check whether the serializable data contains desired element, auto mark name as resolved
zfstring checkCategory(const ZFSerializableData &serializableData)
util to check whether the serializable data contains category, auto mark as resolved
Definition ZFSerializableUtil.h:157