Private/Import-AtwsCmdLet.ps1


Function Import-AtwsCmdLet
{
  [CmdLetBinding(
      SupportsShouldProcess = $True,
      ConfirmImpact = 'Medium'
  )]
  Param(
    [PSObject[]]
    $Entities = $(Get-AtwsFieldInfo -Dynamic)
  )
  
  Begin
  { 
    # Prepare parameters for @splatting
    $ProgressId = 2
    $ProgressParameters = @{
      Activity = 'Creating and importing functions for all Autotask entities with picklists.'
      Id = $ProgressId
    }
    
    # Enable modern -Debug behavior
    If ($PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent) {$DebugPreference = 'Continue'}  
              
    Write-Debug -Message ('{0}: Start of functions.' -F $MyInvocation.MyCommand.Name)
    
    $RootPath = '{0}\WindowsPowershell\Cache\{1}' -f $([environment]::GetFolderPath('MyDocuments')), $Script:Atws.CI
    
    If (-not (Test-Path "$RootPath\Dynamic")) {
      $Null = New-Item -Path "$RootPath\Dynamic" -ItemType Directory -Force
    }
    
  } 
  
  Process
  {
            
    # Prepare Index for progressbar
    $Index = 0
    
    Write-Verbose -Message ('{0}: Creating functions for {1} entities' -F $MyInvocation.MyCommand.Name, $Entities.count) 
        
    Foreach ($CacheEntry in $Entities.GetEnumerator()) {
      # EntityInfo()
      $Entity = $CacheEntry.Value.EntityInfo
      
      Write-Debug -Message ('{0}: Creating functions for entity {1}' -F $MyInvocation.MyCommand.Name, $Entity.Name) 
      
      # Calculating progress percentage and displaying it
      $Index++
      $PercentComplete = $Index / $Entities.Count * 100
      
      # Add parameters for @splatting
      $ProgressParameters['PercentComplete'] = $PercentComplete
      $ProgressParameters['Status'] = 'Entity {0}/{1} ({2:n0}%)' -F $Index, $Entities.Count, $PercentComplete
      $ProgressParameters['CurrentOperation'] = 'Importing {0}' -F $Entity.Name
      
      Write-Progress @ProgressParameters
      
      $Caption = $MyInvocation.MyCommand.Name
      $VerboseDescription = '{0}: Creating and Invoking functions for entity {1}' -F $Caption, $Entity.Name
      $VerboseWarning = '{0}: About to create and Invoke functions for entity {1}. Do you want to continue?' -F $Caption, $Entity.Name
       
      $FunctionDefinition = Get-AtwsFunctionDefinition -Entity $Entity -FieldInfo $CacheEntry.Value.FieldInfo
        
      If ($PSCmdlet.ShouldProcess($VerboseDescription, $VerboseWarning, $Caption)) { 
      
        Foreach ($Function in $FunctionDefinition.GetEnumerator()) {
          # Set path to powershell script file in user cache
          $FilePath = '{0}\Dynamic\{1}.ps1' -F $RootPath, $Function.Key
          
          # IMport the updated function
          . ([ScriptBlock]::Create($Function.Value))
          
          # Export the module member
          Export-ModuleMember -Function $Function.Key
          
          # Write the function to disk for faster load later
          Set-Content -Path $FilePath -Value $Function.Value -Force -Encoding UTF8           
        }
      }
    }        

  }
  End
  {
    Write-Debug -Message ('{0}: Imported {1} dynamic functions' -F $MyInvocation.MyCommand.Name, $Index)
  }
}