Skip to content

Commit 9f0bd15

Browse files
committed
add serdeDynamicAlgebraic
1 parent ea89748 commit 9f0bd15

1 file changed

Lines changed: 71 additions & 0 deletions

File tree

source/mir/serde.d

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
/++
296367
Returns:
297368
immutable array of the input keys for the symbol or enum value

0 commit comments

Comments
 (0)