Public/Get-PropertySet.ps1

function Get-PropertySet {
    param (
        [Parameter()]
        [string]
        $Name
    )
    begin {
        Write-Verbose "Retrieving property set with name: $Name"
        # Store property sets in cache to avoid multiple reads
        # This is a simple cache implementation, could be improved with more complex logic
        # or using a more sophisticated caching mechanism.
        if ($null -eq $script:GatekeeperPropertySets) {
            $script:GatekeeperPropertySets = @{}
            $folder = Get-PropertySetFolder
            Write-Verbose "Loading property sets from folder: $folder"
            $propertySetFiles = Get-ChildItem -Path $folder -Filter '*.json' -File
            foreach ($file in $propertySetFiles) {
                Write-Verbose "Reading property set from file: $($file.FullName)"
                $propertySet = Read-PropertySet -FilePath $file.FullName
                if ($null -ne $propertySet) {
                    $script:GatekeeperPropertySets[$file.BaseName] = $propertySet
                    Write-Verbose "Loaded property set: $($propertySet.Name)"
                } else {
                    Write-Warning "Failed to load property set from file: $($file.FullName)"
                }
            }
        }
        $propertySets = $script:GatekeeperPropertySets
    }

    process {
        # If name is given, return just that property set
        if ($Name) {
            return $propertySets[$Name]
        }

        # If no name is given, return all property sets
        if ($propertySets.Count -eq 0) {
            Write-Warning "No property sets found in the folder."
            return @()
        }
        Write-Verbose "Returning all property sets."
        return $propertySets.Values
    }

    end {
        Write-Verbose "Completed retrieval of property sets."
    }
}