Export-RegEx.ps1

function Export-RegEx
{
    <#
    .Synopsis
        Exports a RegEx
    .Description
        Exports one or more Regular Expressions
    .Link
        Import-RegEx
    .Link
        Set-RegEx
    .Example
        Export-RegEx -Name Digits, Decimals -Path $home\MyRegExs
    .Example
        Export-RegEx -Name Digits, Decimals -As Script # Creates a script that embedes the expressions and Use-RegEx
    .Notes
        When exporting as a script, Use-RegEx is renamed to UseRegex.
        This enables embedding the core of Irregular and your Regular Expressions into a module while making it easy to avoid exporting Irregular.
 
        To use this within a module, make sure your module explicitly exports commands, or exports with a wildcard like '*-*'.
    #>

    [CmdletBinding(SupportsShouldProcess=$true)]
    param(
    # The name of the regular expression. If not provided, this can be inferred if the pattern starts with a capture
    [Parameter(ValueFromPipelineByPropertyName)]
    [string[]]
    $Name,

    # The export path.
    # If this is not provided, it will export regular expressions to the user's Irregular module path.
    [Parameter(ValueFromPipelineByPropertyName)]
    [string]
    $Path,

    # How the expression will be exported.
    [ValidateSet('Metadata', 'File','Pattern','Hashtable', 'String','Variable', 'Alias','Script','Lambda','Engine','Embedded')]
    [string]
    $As = 'File',

    # If provided, will rename -RegEx commands with the provided -Noun.
    # This option is only valid when -As is Engine.
    # It prevents name conflicts with Irregular.
    [string]
    $Noun
    )

    begin {
        $exportContent = [Collections.ArrayList]::new()
    }

    process {
        if (-not $PSBoundParameters.Pattern -and -not $PSBoundParameters.Name) {
            Write-Error "Must provide a pattern or a name" -ErrorId Irregular.Missing.Pattern.And.Name
            return
        }

        #region Find the Export Path
        if (-not $path -and $as -eq 'File') { # If haven't been provided a path and we're exporting to a file
            $modulePaths = # find the preferred path
                $env:PSModulePath -split $(if ($PSVersionTable.Platform -eq 'Unix') { ':' } else {';' })
            $preferredPath =
                foreach ($mp in $modulePaths) { # It's the first valid module path
                    if ($PSVersionTable.Platform -eq 'Unix' -and $mp -like '/usr/*') { # beneath /usr/ (on Unix)
                        $mp;break
                    }
                    if ($PSVersionTable.Platform -ne 'Unix' -and $mp -like "$env:USERPROFILE*") { # or %userprofile% (on Windows)
                        $mp;break
                    }
                }
            if (-not $preferredPath) { return }
            $path = $preferredPath.TrimEnd([IO.Path]::DirectorySeparatorChar), 'Irregular', 'RegEx' -join [IO.Path]::DirectorySeparatorChar
            if (-not [IO.Directory]::Exists($Path)) {
                $path = New-Item -ItemType Directory -Path $path -Force
                if (-not $path) {  return }
            }
        }
        #endregion Find the Export Path

        if ($path -match '/|\\.+?\.' -and $name.Count -and $as -eq 'File') {
            Write-Error "Must provide a directory if exporting more than one regular expression into files" -ErrorId Irregular.One.Too.Many.Exports
            return
        }
        if (-not $Name) {
            $Name = $Script:_RegexLibrary.Keys
        }
        $exportContent.AddRange(@(
        foreach ($n in $Name) {
            $regex = $Script:_RegexLibraryMetaData.$n
            if ($as -eq 'File') {
                $ext =
                    if ($_.IsGenerator) {
                        'ps1'
                    } else {
                        'txt'
                    }
                $dest = Join-Path $Path "$n.regex.$ext"
                if ($regex.Path -and $regex.Path -ne $dest) {
                    Copy-Item -LiteralPath $regex.Path -Destination $dest
                } elseif (-not $regex.Path -and $regex.Pattern) {
                    Set-Regex -Path $Path -Name $n -Pattern $regex.Pattern
                }
            } else {
                $regex
            }

        }))
    }

    end {
        $toExport =
            @(if ($exportContent.Count) {
                $exportNames  = $exportContent | Select-Object -ExpandProperty Name
                Get-RegEx -Name $exportNames -As $As -Noun $Noun
            }) -join [Environment]::NewLine

        if ($Path -and $toExport) {
            $toExport | Set-Content $Path -Encoding UTF8
        } elseif ($toExport) {
            $toExport
        }
    }
}