parseDefArray function

List parseDefArray(
  1. ParsingContext context,
  2. int level
)

Implementation

List<dynamic> parseDefArray(
    ParsingContext context,
    int level
    )
{
    var array = <dynamic>[];

    while ( context.lineIndex < context.lineArray.length )
    {
        var DefLine( :line, :lineSpaceCount )
            = parseDefLine( context, level );

        if ( lineSpaceCount == 0
             && line == ']' )
        {
            return array;
        }
        else if ( lineSpaceCount == 0
                  && line == ']{}' )
        {
            if ( array.length == 0 )
            {
                return [];
            }
            else
            {
                if ( array[ 0 ] is List )
                {
                    if ( array.length == 1 )
                    {
                        return [];
                    }
                    else
                    {
                        var keyArray = <String>[];

                        for ( var key in array[ 0 ] )
                        {
                            keyArray.add( getKeyText( key ) );
                        }

                        var keyCount = keyArray.length;
                        var objectArray = <Map<String, dynamic>>[];
                        var objectCount = array.length - 1;

                        for ( int objectIndex = 0;
                              objectIndex < objectCount;
                              ++objectIndex )
                        {
                            var valueArray = array[ objectIndex + 1 ];

                            if ( valueArray is List
                                 && valueArray.length == keyCount )
                            {
                                var object = <String, dynamic>{};

                                for ( int keyIndex = 0;
                                      keyIndex < keyCount;
                                      ++keyIndex )
                                {
                                    object[ keyArray[ keyIndex ] ] = valueArray[ keyIndex ];
                                }

                                objectArray.add( object );
                            }
                            else
                            {
                                throwParsingError( 'Invalid DEF object array', context, level );
                            }
                        }

                        return objectArray;
                    }
                }
                else
                {
                    throwParsingError( 'Invalid DEF object array', context, level );
                }
            }
        }
        else if ( lineSpaceCount == 0
                  && line == ']()' )
        {
            if ( array.length == 0 )
            {
                return [];
            }
            else
            {
                if ( array[ 0 ] is List )
                {
                    if ( array.length == 1 )
                    {
                        return [];
                    }
                    else
                    {
                        var keyArray = <String>[];

                        for ( var key in array[ 0 ] )
                        {
                            keyArray.add( getKeyText( key ) );
                        }

                        var keyCount = keyArray.length;
                        var mapArray = <Map<dynamic, dynamic>>[];
                        var mapCount = array.length - 1;

                        for ( int mapIndex = 0;
                              mapIndex < mapCount;
                              ++mapIndex )
                        {
                            var valueArray = array[ mapIndex + 1 ];

                            if ( valueArray is List
                                 && valueArray.length == keyCount )
                            {
                                var map = <dynamic, dynamic>{};

                                for ( int keyIndex = 0;
                                      keyIndex < keyCount;
                                      ++keyIndex )
                                {
                                    map[ keyArray[ keyIndex ] ] = valueArray[ keyIndex ];
                                }

                                mapArray.add( map );
                            }
                            else
                            {
                                throwParsingError( 'Invalid DEF map array', context, level );
                            }
                        }

                        return mapArray;
                    }
                }
                else
                {
                    throwParsingError( 'Invalid DEF map array', context, level );
                }
            }
        }
        else
        {
            context.lineIndex--;

            var value = parseDefValue( context, level + 1 );
            array.add( value );
        }
    }

    throwParsingError( 'Invalid DEF array', context, level );

    return [];
 }