/// <exception cref = "FormatException"> /// <paramref name = "caseRoute" /> doesn't match any case in <paramref name = "unionInfo" />. /// </exception> public static IUnionCaseInfo GetNestedCaseInfo(this IUnionInfo unionInfo, Route caseRoute) { // ReSharper disable once SuggestVarOrType_SimpleTypes var caseRouteEnumerator = caseRoute.nodes.GetEnumerator(); if (!caseRouteEnumerator.MoveNext()) { throw new FormatException("Route is empty."); } else { var currentUnionInfo = unionInfo; while (true) { var caseName = caseRouteEnumerator.Current; var hasNextCaseInfo = currentUnionInfo.caseInfosByNames.TryGetValue(caseName, out var nextCaseInfo); if (!hasNextCaseInfo) { var msg = $"Route '{caseRoute}' doesn't match any case in {unionInfo}: " + $"'{currentUnionInfo}' doesn't contain '{caseName}'."; throw new FormatException(msg); } else if (!caseRouteEnumerator.MoveNext()) { return(nextCaseInfo); } else { if (nextCaseInfo.asUnionInfo is {} nextUnionInfo) { currentUnionInfo = nextUnionInfo; }
public UnionCaseInfo(IDataTypeInfo dataTypeInfo, IUnionInfo declaringUnionInfo) { var t = dataTypeInfo.dataType; this.dataTypeInfo = dataTypeInfo; this.declaringUnionInfo = declaringUnionInfo; name = t.MayGetCompanion <IUnionCaseNameProvider>()?.GetUnionCaseName(t) ?? t.Name; }
public UnionJsonConverter(IUnionInfo unionInfo) => this.unionInfo = unionInfo;