fetchDefFile function

Future<String> fetchDefFile(
  1. String filePath, {
  2. Future<String> fileFetchingFunction(
    1. String
    ) = fetchTextFile,
  3. Future<List<String>> fileFindingFunction(
    1. String
    ) = findMatchingFiles,
  4. bool hasImportCommands = true,
  5. RegExp? importCommandRegularExpression,
})

Implementation

Future<String> fetchDefFile(
    String filePath,
    {
        Future<String> Function( String ) fileFetchingFunction = fetchTextFile,
        Future<List<String>> Function( String ) fileFindingFunction = findMatchingFiles,
        bool hasImportCommands = true,
        RegExp? importCommandRegularExpression
    }
    ) async
{
    var fileText = ( await fileFetchingFunction( filePath ) ).trimRight();

    if ( hasImportCommands )
    {
        if ( importCommandRegularExpression == null )
        {
            importCommandRegularExpression = RegExp( r"^'@(.+\.def)'$" );
        }

        var folderPath = filePath.substring( 0, filePath.lastIndexOf( '/' ) + 1 );
        var lineArray = fileText.split( '\n' );

        for ( int lineIndex = 0;
              lineIndex < lineArray.length;
              ++lineIndex )
        {
            var line = lineArray[ lineIndex ];
            var trimmedLine = line.trim();
            var importCommandMatch = importCommandRegularExpression.firstMatch( trimmedLine );

            if ( importCommandMatch != null )
            {
                var importedFileFilter = importCommandMatch.group( 1 )!;
                var importedFilePathArray = await fileFindingFunction( importedFileFilter );

                for ( var importedFilePath in importedFilePathArray )
                {
                    var importedFileText =
                        await fetchDefFile(
                            folderPath + importedFilePath,
                            fileFetchingFunction: fileFetchingFunction,
                            hasImportCommands: hasImportCommands,
                            importCommandRegularExpression: importCommandRegularExpression
                            );

                    var indentation = line.substring( 0, line.length - line.trimLeft().length );
                    var indentedLineArray = importedFileText.split( '\n' );

                    for ( int indentedLineIndex = 0;
                        indentedLineIndex < indentedLineArray.length;
                        ++indentedLineIndex )
                    {
                        indentedLineArray[ indentedLineIndex ] = indentation + indentedLineArray[ indentedLineIndex ];
                    }

                    lineArray.removeAt( lineIndex );
                    lineArray.insertAll( lineIndex, indentedLineArray );
                    lineIndex += indentedLineArray.length - 1;
                }
            }
        }

        fileText = lineArray.join( '\n' );
    }

    return fileText;
}