Env.psm1

<#
.Synopsis
Creates a Powershell process with an environment with dot-sourced content from the .environment folder.
 
.Description
To use it create a folder caled .environment and fulfill by your content t oset up the environment.
Calling Env at the folder with a .environment folder will create a new Powershell process and dot source
everything that exists at the .environment folder
 
.Example
PS > Env - Will create a new console at the same window
 
PS > Env "some PS code to execute" - Will create a new console, execute the code and exit
 
#>


# =============================================================================
# Private stuff
# =============================================================================

function Get-PS
{
    if ($PSVersionTable.PSVersion.Major -gt 5)
    {
        return "pwsh"
    }
    else
    {
        return "powershell"
    }
}

function EnvStart($code, $NoExit)
{


    $start_args = @()
    $start_args += "-NoLogo"

    #adding a command key
    if ($NoExit)
    { $start_args += "-NoExit", "-Command", "echo '`nPS Subprocess with the Environment`n=============started==============`n';" }
    else
    { $start_args += "-Command" }

    #adding a command
    if ($code -and ($code) -ne "")
    { $start_args += $code }
    Start-Process -NoNewWindow -Wait -FilePath $(Get-PS) -ArgumentList $start_args
    echo "`n=============closed=======env========`nPS Subprocess with the Environment`n"
}

$env_main_codeblock=@"
Get-ChildItem `".\.environment\*.ps1`" | ForEach-Object { .`$_ };
Set-Variable -Name "EnvRootDir" -Value $(Get-Location)
"@

# =============================================================================
# Public
# =============================================================================
function Env($code)
{
    $env = Test-Path -Path "$(Get-Location)\.environment\*.ps1" # TODO move this check into $env_main_codeblock
    if (!$env) # TODO move this check into $env_main_codeblock
    {
        Write-Verbose "No environment found"
        return
    }

    if ($code)
    { EnvStart "$env_main_codeblock; $code" -NoExit 0 }
    else
    { EnvStart "$env_main_codeblock" -NoExit 1 }

}

function Env-Init
{
    $env = Test-Path -Path "$(Get-Location)\.environment\*.ps1"
    if ($env)
    {
        Write-Output "./.environment folder is already has scripts";
        return
    }
    New-Item -ItemType Directory -Path "$(Get-Location)\.environment" -ErrorAction SilentlyContinue
    New-Item -ItemType File -Path "$(Get-Location)\.environment\init.ps1"
    $init_ps1_content = @'
# It is a basic Env template. For more information see: https://github.com/an-dr/Env
 
$host.ui.RawUI.WindowTitle = $(Get-Item -Path $(Get-Location)).BaseName # WindowsTitle is CWD name
'@

    $init_ps1_path = "$(Get-Location)\.environment\init.ps1"
    Add-Content $init_ps1_path $init_ps1_content
}

function Env-Open
{
    Start-Process explorer -ArgumentList "$(Get-Location)\.environment"

}

Export-ModuleMember -Function 'Env'
Export-ModuleMember -Function 'Env-Init'
Export-ModuleMember -Function 'Env-Open'