DSCResources/FilesAndFolders/FilesAndFolders.schema.psm1

configuration FilesAndFolders
{
    param (
        [Parameter(Mandatory)]
        [hashtable[]]$Items
    )
    
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName FileSystemDsc

    foreach ($item in $Items)
    {
        $permissions = $null

        # Remove Case Sensitivity of ordered Dictionary or Hashtables
        $item = @{}+$item

        if (-not $item.ContainsKey('Ensure'))
        {
            $item.Ensure = 'Present'
        }

        if( $item.ContainsKey('Permissions') )
        {
            $permissions = $item.Permissions
            $item.Remove('Permissions')
        }

        if( $item.ContainsKey('ContentFromFile') )
        {
            if( -not (Test-Path -Path $item.ContentFromFile) )
            {
                Write-Host "ERROR: Content file '$($item.ContentFromFile)' not found. Current working directory is: $(Get-Location)" -ForegroundColor Red
            }
            else
            {
                [string]$content = Get-Content -Path $item.ContentFromFile -Raw 
                $item.Contents += $content          
            }
            $item.Remove('ContentFromFile')
        }

        $executionName = "file_$($item.DestinationPath)" -replace '[\s(){}/\\:-]', '_'

        (Get-DscSplattedResource -ResourceName File -ExecutionName $executionName -Properties $item -NoInvoke).Invoke($item)

        if( $null -ne $permissions )
        {
            foreach ($perm in $permissions)
            {         
                # Remove Case Sensitivity of ordered Dictionary or Hashtables
                $perm = @{}+$perm

                $perm.Path      = $item.DestinationPath
                $perm.DependsOn = "[File]$executionName"

                if (-not $perm.ContainsKey('Ensure'))
                {
                    $perm.Ensure = 'Present'
                }

                $permExecName = "$($executionName)__$($perm.Identity)" -replace '[\s(){}/\\:-]', '_'

                (Get-DscSplattedResource -ResourceName FileSystemAccessRule -ExecutionName $permExecName -Properties $perm -NoInvoke).Invoke($perm)
            }
        }
    }
}