@@ -292,6 +292,77 @@ template serdeGetAlgebraicAnnotation(T)
292292 }
293293}
294294
295+ /+ +
296+ User defined attribute used to attach a function that returns a deserialization delegate.
297+
298+ The attribute is usefull for scripting languages and dynamic algebraic types.
299+ +/
300+ template serdeDynamicAlgebraic (alias getAlgebraicDeserializerByAnnotation)
301+ {
302+ enum serdeDynamicAlgebraic;
303+ }
304+
305+ // /
306+ unittest
307+ {
308+ static struct _global
309+ {
310+ alias Deserializer = S delegate (string s, ubyte [] data) @safe pure ;
311+ Deserializer getDeserializer (string name) { return map[name]; }
312+ Deserializer[string ] map;
313+
314+ @serdeDynamicAlgebraic! getDeserializer
315+ struct S {}
316+
317+ static assert (serdeIsDynamicAlgebraic! S);
318+ static assert (__traits(isSame, serdeGetAlgebraicDeserializer! S, getDeserializer));
319+ }
320+ }
321+
322+ /+ +
323+ +/
324+ template serdeIsDynamicAlgebraic (T)
325+ {
326+ static if (isAggregateType! T)
327+ {
328+ static if (hasUDA! (T, serdeDynamicAlgebraic))
329+ {
330+ enum serdeIsDynamicAlgebraic = true ;
331+ }
332+ else
333+ static if (__traits(getAliasThis, T).length)
334+ {
335+ T* aggregate;
336+ alias A = typeof (__traits(getMember, aggregate, __traits(getAliasThis, T)));
337+ enum serdeIsDynamicAlgebraic = .serdeIsDynamicAlgebraic! A;
338+ }
339+ else
340+ {
341+ enum serdeIsDynamicAlgebraic = false ;
342+ }
343+ }
344+ else
345+ {
346+ enum serdeIsDynamicAlgebraic = false ;
347+ }
348+ }
349+
350+ /+ +
351+ +/
352+ template serdeGetAlgebraicDeserializer (T)
353+ {
354+ static if (hasUDA! (T, serdeDynamicAlgebraic))
355+ {
356+ alias serdeGetAlgebraicDeserializer = TemplateArgsOf! (getUDA! (T, serdeDynamicAlgebraic))[0 ];
357+ }
358+ else
359+ {
360+ T* aggregate;
361+ alias A = typeof (__traits(getMember, aggregate, __traits(getAliasThis, T)));
362+ alias serdeGetAlgebraicDeserializer = .serdeGetAlgebraicDeserializer! A;
363+ }
364+ }
365+
295366/+ +
296367Returns:
297368 immutable array of the input keys for the symbol or enum value
0 commit comments