samples/install/helpers.ps1

function parse-packageEntry($entry) {
    if ($entry.GetType().Name -eq "String") {
        if ($entry -notmatch "^\s*(?<name>.*?)\s*(@(?<version>[a-zA-Z0-9\.]+)){0,1}(\[(?<installer>.+)\]){0,1}\s*$") {
            throw "unrecognized package entry '$entry'"
        }

        $packageName = $matches["name"]
        $installer = $matches["installer"]
        $version = $matches["version"]
    }
    elseif ($entry.GetType().Name -eq "OrderedDictionary") {
        $packageConfig = $entry
        $packageName = $entry["name"]
        $after = $packageConfig["after"]
        $version = $packageConfig["version"]
    }
    else {
        throw "unrecognized entry type $($entry.GetType().Name)"
    }


    $defaultInstaller = "choco"
    $additionalArgs = ""
    
    if (!$installer) {
        $installer = $defaultInstaller
    }
    elseif ($installer.StartsWith("-")) {
        $installer = $defaultInstaller
        $additionalArgs = $matches["installer"]
    }
    
    $defaultArgs = switch ($installer) {
        "choco" {
            $a = "install -y $packageName"
            if ($version) {
                $a += " -v $version"
            }
            $a
        }
    }
    
    $installerArgs = "$defaultArgs"
    if ($additionalArgs) {
        $installerArgs = "$installerArgs $additionalArgs"
    }

    if ($installer -match "(?<installer>[^\s]+)\s+(?<args>.+)") {
        $installerArgs = $matches["args"]
        $installer = $matches["installer"]
    }
    else {
        
    }

    $installerArgs = $installerArgs.split(" ") # let's hope there are no quoted arguments...
    
    return @{
        name          = $packageName
        installer     = $installer
        installerArgs = $installerArgs
        after = $after
    }
}

function install-mygroup($group) {
    $submodules = Get-CompletionList $group

    write-verbose "installing group: $($submodules.Keys)" -verbose
    foreach($kvp in $submodules.GetEnumerator()) {
        write-verbose "installing '$($kvp.key)'"
        if (!$kvp.value.installer) {
            throw "package '$($kvp.key)' doesn't have an installer"
        }
        Install-mypackage $kvp.value
    }
}
function install-mypackage($package) {
    write-verbose "$($package.installer) $($package.installerArgs)"
    if (!$package.installer) {
        throw "package '$($package.name)' doesn't have an installer"
    }
    & $package.installer $package.installerArgs
    if ($lastexitcode -eq 0 -and $package.after) {
        Write-Verbose "executing after script"
        Invoke-Expression -Command $package.after
    }
}