Private/NestedFunctions/Get-FunctionReport.ps1

Function Get-FunctionReport {
    Param([string[]]$Folder)
    # Get a list of all functions in the current runspace
    $CurrentFunctions = Get-ChildItem -Path:('function:')
    # Load all function files from the module
    $Files = Get-ChildItem -Path:($Folder) -Recurse | Where-Object { $_.Extension -eq '.ps1' }
    # Loop through each function file
    $FunctionList = ForEach ($File In $Files) {
        $FileFullName = $File.FullName
        $FileName = $File.Name
        $FileBaseName = $File.BaseName

        # Parse the file and look for function syntax to identify functions
        [regex]$Function_Regex = '(?<=^Function)(.*?)(?=$|\{|\()'
        $FunctionContent = Get-Content -Path:($FileFullName)
        $FunctionRegexMatch = $FunctionContent | Select-String -Pattern:($Function_Regex) #| Where {-not [System.String]::IsNullOrEmpty($_)}
        $FunctionRegexMatchObject = $FunctionRegexMatch | Select-Object LineNumber, Line, @{Name = 'MatchValue'; Expression = { ($_.Matches.Value).Trim() } }
        # Load the function into the current runspace
        . ($FileFullName)
        # Regather a list of all functions in the current runspace and filter out the functions that existed before loading the function script
        $ScriptFunctions = Get-ChildItem -Path:('function:') | Where-Object { $CurrentFunctions -notcontains $_ }
        # $ScriptFunctions | Select *
        # Remove the function from the current runspace
        $ScriptFunctions | ForEach-Object { Remove-Item -Path:('function:\' + $_) }
        # $ScriptFunctions.Visibility
        $FolderLocation = If ($FileFullName -like '*Private*') {
            'Private'
        } ElseIf ($FileFullName -like '*Public*') {
            'Public'
        } Else {
            'Unknown'
        }
        # Build dataset to perform validations against
        [PSCustomObject]@{
            'FullName'       = $File.FullName;
            'FileName'       = $FileName;
            'LineNumber'     = $FunctionRegexMatchObject.LineNumber
            'FileBaseName'   = $FileBaseName;
            'Function'       = $ScriptFunctions.Name
            'MatchValue'     = $FunctionRegexMatchObject.MatchValue
            'Line'           = $FunctionRegexMatchObject.Line
            'Verb'           = $ScriptFunctions.Verb
            'Noun'           = $ScriptFunctions.Noun
            'FolderLocation' = $FolderLocation
            'Content'        = $FunctionContent
        }
    }
    Return $FunctionList
}