public/Invoke-MyCommand.ps1

<#
.SYNOPSIS
Execute the command

.PARAMETER Command
Command to be executed

.OUTPUTS
Return of the expression

.EXAMPLE
Invoke-MyCommand -Command 'gh api user'

#>


function Invoke-MyCommand {
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory,ValueFromPipeline,Position=0)][string]$Command,
        [Parameter(Position=1)][hashtable]$Parameters
    )

    process{

        $cmd = Build-Command -Command $Command -Parameters $Parameters

        $scriptBlock = New-ScriptBlock -Command $cmd

        if ($PSCmdlet.ShouldProcess("Target", $command)) {

            $result = Invoke-Command -ScriptBlock $scriptBlock

        } else {
            Write-Information $scriptBlock
            $result = $null
        }

        return $result
    }
} Export-ModuleMember -Function Invoke-MyCommand

<#
.SYNOPSIS
    Execute a set of commands and return the results as a PSCustomObject serialized from Json command output

.EXAMPLE
    Invoke-MyCommandJson -Command 'gh api user'
#>

function Invoke-MyCommandJson {
    [CmdletBinding(SupportsShouldProcess)]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '', Scope='Function')]
    # False positive. We need -WhatIf to call later Invoke-MyCommand with this preferences
    param(
        [Parameter(Mandatory,Position=0)][string]$Command,
        [Parameter(Position=1)][hashtable]$Parameters
    )

   $resultJson = Invoke-MyCommand -Command $Command -Parameters $Parameters

   $result = $resultJson | ConvertFrom-Json

    return $result
} Export-ModuleMember -Function Invoke-MyCommandJson