private static ParseResult ParseSingleRelation()

in SharpGen/Transform/RelationParser.cs [153:218]


        private static ParseResult ParseSingleRelation(ExpressionSyntax item)
        {
            if (item is not InvocationExpressionSyntax invocationExpression)
                return new ParseResult(ParseResult.ParseIssue.RelationInvocationExpected, item.Span);

            var functionNameExpression = invocationExpression.Expression;

            if (functionNameExpression is not IdentifierNameSyntax functionIdentifier)
                return new ParseResult(
                    ParseResult.ParseIssue.SimpleIdentifierAsFunctionNameExpected,
                    functionNameExpression.Span
                );

            var argumentList = invocationExpression.ArgumentList.Arguments;

            ParseResult ParseLengthRelation(string identifier)
            {
                return argumentList.Count switch
                {
                    1 => new ParseResult(
                        new LengthRelation
                        {
                            Identifier = argumentList[0].Expression.ToString()
                        },
                        identifier
                    ),
                    _ => new ParseResult(ParseResult.ParseIssue.ArgumentCountMismatch, argumentList.Span)
                };
            }

            ParseResult ParseConstantValueRelation(string identifier)
            {
                return argumentList.Count switch
                {
                    1 => new ParseResult(
                        new ConstantValueRelation
                        {
                            Value = argumentList[0].Expression
                        },
                        identifier
                    ),
                    _ => new ParseResult(ParseResult.ParseIssue.ArgumentCountMismatch, argumentList.Span)
                };
            }

            ParseResult ParseStructSizeRelation(string identifier)
            {
                return argumentList.Count switch
                {
                    0 => new ParseResult(new StructSizeRelation(), identifier),
                    _ => new ParseResult(ParseResult.ParseIssue.ArgumentCountMismatch, argumentList.Span)
                };
            }

            var identifierText = functionIdentifier.Identifier.ValueText;
            return identifierText switch
            {
                "length" => ParseLengthRelation(identifierText),
                "Length" => ParseLengthRelation(identifierText),
                ConstReplacement => ParseConstantValueRelation(identifierText),
                "Const" => ParseConstantValueRelation(identifierText),
                StructSizeReplacement => ParseStructSizeRelation(identifierText),
                "StructSize" => ParseStructSizeRelation(identifierText),
                _ => new ParseResult(ParseResult.ParseIssue.UnknownRelation, functionIdentifier.Span)
            };
        }