Tools/Server.ps1


function Server
{
    param (
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [scriptblock]
        $ScriptBlock,
        
        [Parameter()]
        [ValidateNotNull()]
        [int]
        $Port = 0,

        [switch]
        $Smtp,

        [switch]
        $Tcp,

        [switch]
        $Https
    )

    # create session object
    $PodeSession = New-Object -TypeName psobject |
        Add-Member -MemberType NoteProperty -Name Routes -Value $null -PassThru |
        Add-Member -MemberType NoteProperty -Name TcpHandlers -Value $null -PassThru |
        Add-Member -MemberType NoteProperty -Name Port -Value $Port -PassThru | 
        Add-Member -MemberType NoteProperty -Name ViewEngine -Value 'HTML' -PassThru | 
        Add-Member -MemberType NoteProperty -Name Web -Value @{} -PassThru | 
        Add-Member -MemberType NoteProperty -Name Smtp -Value @{} -PassThru | 
        Add-Member -MemberType NoteProperty -Name Tcp -Value @{} -PassThru

    # setup for initial routing
    $PodeSession.Routes = @{
        'delete' = @{};
        'get' = @{};
        'head' = @{};
        'merge' = @{};
        'options' = @{};
        'patch' = @{};
        'post' = @{};
        'put' = @{};
        'trace' = @{};
    }

    # setup for initial smtp/tcp handlers
    $PodeSession.TcpHandlers = @{
        'tcp' = $null;
        'smtp' = $null;
    }

    # if smtp is passed, and no port - force port to 25
    if ($Port -eq 0 -and $Smtp)
    {
        $Port = 25
        $PodeSession.Port = $Port
    }
    
    # validate port passed
    if ($Port -le 0)
    {
        throw "Port cannot be negative: $($Port)"
    }

    # run logic for a smtp server
    if ($Smtp)
    {
        & $ScriptBlock
        Start-PodeSmtpServer
    }

    # run logic for a tcp server
    elseif ($Tcp)
    {
        & $ScriptBlock
        Start-PodeTcpServer
    }

    # if there's a port, run a web server
    elseif ($Port -gt 0)
    {
        & $ScriptBlock
        Start-PodeWebServer -Https:$Https
    }

    # otherwise, run logic
    else
    {
        & $ScriptBlock
    }

    # clean up the session
    $PodeSession = $null
}