/// <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;
                        }
Пример #2
0
        public UnionCaseInfo(IDataTypeInfo dataTypeInfo, IUnionInfo declaringUnionInfo)
        {
            var t = dataTypeInfo.dataType;

            this.dataTypeInfo       = dataTypeInfo;
            this.declaringUnionInfo = declaringUnionInfo;
            name = t.MayGetCompanion <IUnionCaseNameProvider>()?.GetUnionCaseName(t) ?? t.Name;
        }
Пример #3
0
 public UnionJsonConverter(IUnionInfo unionInfo) =>
 this.unionInfo = unionInfo;