HomeAssistantX.Libraries.ps1

# HomeAssistantX.Libraries.ps1
# Auto-generated by PowerForge. Do not edit.

$LibrariesByFolder = @{
    'Core' = @(
        'Lib\Core\NodaTime.dll'
        'Lib\Core\TimeZoneConverter.dll'
        'Lib\Core\HomeAssistantX.dll'
        'Lib\Core\HomeAssistantX.PowerShell.dll'
    )
    'Default' = @(
        'Lib\Default\System.Buffers.dll'
        'Lib\Default\System.Numerics.Vectors.dll'
        'Lib\Default\System.Runtime.CompilerServices.Unsafe.dll'
        'Lib\Default\NodaTime.dll'
        'Lib\Default\System.Memory.dll'
        'Lib\Default\System.Text.Encodings.Web.dll'
        'Lib\Default\System.Threading.Tasks.Extensions.dll'
        'Lib\Default\Microsoft.Bcl.AsyncInterfaces.dll'
        'Lib\Default\System.IO.Pipelines.dll'
        'Lib\Default\System.Text.Json.dll'
        'Lib\Default\System.Threading.Channels.dll'
        'Lib\Default\TimeZoneConverter.dll'
        'Lib\Default\HomeAssistantX.dll'
        'Lib\Default\HomeAssistantX.PowerShell.dll'
    )
    'Standard' = @(
        'Lib\Standard\System.Buffers.dll'
        'Lib\Standard\System.Numerics.Vectors.dll'
        'Lib\Standard\System.Runtime.CompilerServices.Unsafe.dll'
        'Lib\Standard\NodaTime.dll'
        'Lib\Standard\System.Memory.dll'
        'Lib\Standard\System.Text.Encodings.Web.dll'
        'Lib\Standard\System.Threading.Tasks.Extensions.dll'
        'Lib\Standard\Microsoft.Bcl.AsyncInterfaces.dll'
        'Lib\Standard\System.IO.Pipelines.dll'
        'Lib\Standard\System.Text.Json.dll'
        'Lib\Standard\System.Threading.Channels.dll'
        'Lib\Standard\TimeZoneConverter.dll'
        'Lib\Standard\HomeAssistantX.dll'
        'Lib\Standard\HomeAssistantX.PowerShell.dll'
    )
}


$LibRoot = [IO.Path]::Combine($PSScriptRoot, 'Lib')
$AssemblyFolders = Get-ChildItem -LiteralPath $LibRoot -Directory -ErrorAction SilentlyContinue
$Root = @(Get-ChildItem -LiteralPath $LibRoot -File -ErrorAction SilentlyContinue | Where-Object Extension -IEQ '.dll').Count -gt 0

$Default = $false
$Core = $false
$Standard = $false
foreach ($A in $AssemblyFolders.Name) {
    if ($A -eq 'Default') {
        $Default = $true
    } elseif ($A -eq 'Core') {
        $Core = $true
    } elseif ($A -eq 'Standard') {
        $Standard = $true
    }
}
if ($Standard -and $Core -and $Default) {
    $FrameworkNet = 'Default'
    $Framework = 'Standard'
} elseif ($Standard -and $Core) {
    $Framework = 'Standard'
    $FrameworkNet = 'Standard'
} elseif ($Core -and $Default) {
    $Framework = 'Core'
    $FrameworkNet = 'Default'
} elseif ($Standard -and $Default) {
    $Framework = 'Standard'
    $FrameworkNet = 'Default'
} elseif ($Standard) {
    $Framework = 'Standard'
    $FrameworkNet = 'Standard'
} elseif ($Core) {
    $Framework = 'Core'
    $FrameworkNet = ''
} elseif ($Default) {
    $Framework = ''
    $FrameworkNet = 'Default'
} elseif ($Root) {
    $Framework = ''
    $FrameworkNet = ''
} else {
    #Write-Error -Message 'No assemblies found'
}

if ($PSEdition -eq 'Core') {
    $PowerForgeRuntimeVersion = [Environment]::Version
    $PowerForgeCoreBaselineVersion = $null
    if ($Core) {
        $PowerForgeCoreMarkerPath = [IO.Path]::Combine($LibRoot, 'Core', 'PowerForge.TargetFramework.txt')
        if (Test-Path -LiteralPath $PowerForgeCoreMarkerPath -PathType Leaf) {
            try {
                $PowerForgeCoreTargetFramework = [IO.File]::ReadAllText($PowerForgeCoreMarkerPath).Trim()
                if ($PowerForgeCoreTargetFramework -match '^net(?:coreapp)?(\d+\.\d+)$') {
                    $PowerForgeCoreBaselineVersion = [Version]$Matches[1]
                }
            } catch { $PowerForgeCoreBaselineVersion = $null }
        }
    }
    $PowerForgeSelectedRuntimeVersion = [Version]'0.0'
    $PowerForgeSelectedRuntimeFolder = $null
    if ($Core -and $null -ne $PowerForgeCoreBaselineVersion -and $PowerForgeCoreBaselineVersion -le $PowerForgeRuntimeVersion) {
        $PowerForgeSelectedRuntimeVersion = $PowerForgeCoreBaselineVersion
        $PowerForgeSelectedRuntimeFolder = 'Core'
    }
    foreach ($PowerForgeRuntimeFolder in @($AssemblyFolders.Name)) {
        if ($PowerForgeRuntimeFolder -notmatch '^Core-(?:net|netcoreapp)(\d+\.\d+)$') { continue }
        try { $PowerForgeCandidateRuntimeVersion = [Version]$Matches[1] } catch { continue }
        if ($PowerForgeCandidateRuntimeVersion -le $PowerForgeRuntimeVersion -and $PowerForgeCandidateRuntimeVersion -gt $PowerForgeSelectedRuntimeVersion -and (Test-Path -LiteralPath ([IO.Path]::Combine($LibRoot, $PowerForgeRuntimeFolder)))) {
            $PowerForgeSelectedRuntimeVersion = $PowerForgeCandidateRuntimeVersion
            $PowerForgeSelectedRuntimeFolder = $PowerForgeRuntimeFolder
        }
    }
    if (-not [string]::IsNullOrWhiteSpace($PowerForgeSelectedRuntimeFolder)) {
        $Framework = $PowerForgeSelectedRuntimeFolder
    } elseif ($Core -and (-not $Standard -or ($null -ne $PowerForgeCoreBaselineVersion -and $PowerForgeCoreBaselineVersion -le $PowerForgeRuntimeVersion))) {
        $Framework = 'Core'
    } elseif ($Standard) {
        $Framework = 'Standard'
    }
}

if ($PSEdition -eq 'Core') {
    $LibFolder = $Framework
} else {
    $LibFolder = $FrameworkNet
}

$LibraryFoldersToLoad = @($LibFolder)
if ($null -ne $ResolvePowerForgeModuleAssembly) {
    $PowerForgeLibrariesRoot = [IO.Path]::GetFullPath($LibRoot)
    $PowerForgeLibrariesRootPrefix = $PowerForgeLibrariesRoot
    if (-not $PowerForgeLibrariesRootPrefix.EndsWith([IO.Path]::DirectorySeparatorChar.ToString(), [StringComparison]::Ordinal)) {
        $PowerForgeLibrariesRootPrefix += [IO.Path]::DirectorySeparatorChar
    }
    foreach ($PowerForgeLibraryFileName in $LibraryFileNames) {
        try {
            $PowerForgeResolvedLibrary = & $ResolvePowerForgeModuleAssembly -LibraryFileName $PowerForgeLibraryFileName
        } catch {
            Write-Verbose "Skipping preload-folder discovery for '$PowerForgeLibraryFileName'. $($_.Exception.Message)"
            continue
        }
        $PowerForgeResolvedLibraryDirectory = [IO.Path]::GetFullPath($PowerForgeResolvedLibrary.Directory)
        $PowerForgeResolvedLibraryFolder = if ($PowerForgeResolvedLibraryDirectory -ieq $PowerForgeLibrariesRoot) {
            ''
        } elseif ($PowerForgeResolvedLibraryDirectory.StartsWith($PowerForgeLibrariesRootPrefix, [StringComparison]::OrdinalIgnoreCase)) {
            $PowerForgeResolvedLibraryDirectory.Substring($PowerForgeLibrariesRootPrefix.Length).Replace('\\', '/').Trim('/')
        }
        if ($null -ne $PowerForgeResolvedLibraryFolder -and
            $LibrariesByFolder.ContainsKey($PowerForgeResolvedLibraryFolder) -and
            $PowerForgeResolvedLibraryFolder -notin $LibraryFoldersToLoad) {
            $LibraryFoldersToLoad += $PowerForgeResolvedLibraryFolder
        }
    }
}

$LibrariesToLoad = @(
    foreach ($LibraryFolderToLoad in $LibraryFoldersToLoad) {
        if ($LibrariesByFolder.ContainsKey($LibraryFolderToLoad)) {
            $LibrariesByFolder[$LibraryFolderToLoad]
        }
    }
) | Select-Object -Unique
foreach ($L in $LibrariesToLoad) {
    try {
        $LibraryPathParts = @($PSScriptRoot) + @($L -split '[\\/]' | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
        $LibraryPath = [IO.Path]::Combine([string[]] $LibraryPathParts)
        Add-Type -Path $LibraryPath -ErrorAction Stop
    } catch {
        if ($_.Exception.Message -like '*Assembly with same name is already loaded*') {
            Write-Warning -Message "Assembly with same name is already loaded. Ignoring '$L'."
        } else {
            throw $_
        }
    }
}