Private/ConvertFrom-RepoDescription.ps1

<#
.SYNOPSIS
Convierte una descripción de metadata de repositorio en un PSObject estructurado.
 
.DESCRIPTION
Parsea una cadena con formato key:value delimitada por | en un PSObject.
Keys desconocidas se preservan en el campo _extra.
 
.PARAMETER Description
La cadena de metadata a parsear.
 
.OUTPUTS
PSCustomObject con propiedades: type, stack, deploy, model, ci, criticality, _raw, _extra
 
.EXAMPLE
$obj = ConvertFrom-RepoDescription "type:flutter-web|stack:dart|deploy:v2.30.23|model:legacy"
$obj.type # "flutter-web"
$obj.deploy # "v2.30.23"
#>

function ConvertFrom-RepoDescription {
    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [AllowEmptyString()]
        [string]$Description
    )

    process {
        if ([string]::IsNullOrWhiteSpace($Description)) {
            return $null
        }

        $pairs = @{}
        $extra = @{}

        foreach ($segment in $Description.Split('|')) {
            if ($segment -match '^([^:]+):(.+)$') {
                $key = $Matches[1]
                $value = $Matches[2]
                $pairs[$key] = $value
            }
        }

        $knownKeys = @('type', 'stack', 'deploy', 'model', 'ci', 'criticality')
        foreach ($key in $pairs.Keys) {
            if ($key -notin $knownKeys) {
                $extra[$key] = $pairs[$key]
            }
        }

        [PSCustomObject]@{
            type        = if ($pairs.ContainsKey('type'))        { $pairs['type'] }        else { $null }
            stack       = if ($pairs.ContainsKey('stack'))       { $pairs['stack'] }       else { $null }
            deploy      = if ($pairs.ContainsKey('deploy'))      { $pairs['deploy'] }      else { $null }
            model       = if ($pairs.ContainsKey('model'))       { $pairs['model'] }       else { $null }
            ci          = if ($pairs.ContainsKey('ci'))          { $pairs['ci'] }          else { 'github-actions' }
            criticality = if ($pairs.ContainsKey('criticality')) { $pairs['criticality'] } else { 'medium' }
            _raw        = $Description
            _extra      = $extra
        }
    }
}