functions/public/Get-PSProjectStatus.ps1

Function Get-PSProjectStatus {
    [cmdletbinding()]
    [alias("gpstat")]
    [OutputType("PSProject")]
    Param(
        [Parameter(
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName,
            HelpMessage = "Enter the parent path to the psproject.json file, e.g. c:\scripts\mymodule.")]
        [ValidateScript({ Test-Path $_ })]
        [alias("fullname")]
        [string]$Path = "."
    )

    Begin {
        Write-Verbose "Starting $($MyInvocation.MyCommand)"
    }
    Process {
        $json = Join-Path (Convert-Path $path) -ChildPath psproject.json
        if (Test-Path $json) {
            Write-Verbose "Getting project status from $json"
            $in = Get-Content -Path $json | ConvertFrom-Json
            $psproject = [PSProject]::new()

            #get property names from the class
            $properties = $psproject.psobject.properties.name | Where-Object { $_ -ne "Age" }
            foreach ($property in $properties) {
                if ($property -eq 'RemoteRepository') {
                    Write-Verbose "Creating remote repository information"
                    $remote = @()
                    foreach ($repo in $in.RemoteRepository) {
                        $remote += [PSProjectRemote]::new($repo.name, $repo.url, $repo.mode)
                    }
                    $psproject.RemoteRepository = $remote

                }
                else {
                    Write-Verbose "Adding property $property"
                    $psproject.$property = $in.$property
                }
            }
            #datetime is stored as a UTC value so convert it to local
            $psproject.lastUpdate = $psproject.lastUpdate.tolocalTime()
            #write the new object to the pipeline
            $psproject
        }
        else {
            Write-Warning "Can't find psproject.json in the specified location $(Convert-Path $path)."
        }
    } #process

    End {
        Write-Verbose "Ending $($MyInvocation.MyCommand)"
    }
}