Private/Get-AtwsParameterDefinition.ps1

Function Get-AtwsParameterDefinition
{
  [CmdLetBinding()]
  Param
  (   
    [Parameter(Mandatory)]
    [Autotask.EntityInfo]
    $Entity,
        
    [Parameter(Mandatory)]
    [ValidateSet('Get', 'Set', 'New', 'Remove')]
    [String]
    $Verb,
        
    [Parameter(Mandatory)]
    [Autotask.Field[]]
    $FieldInfo
  )
  Begin
  {
      
  }

  Process
  { 
    $TypeName = 'Autotask.{0}' -F $Entity.Name
      
    If ($Verb -eq 'Get')
    {
      Get-AtwsPSParameter -Name 'Filter' -SetName 'Filter' -Type 'String' -Mandatory -Remaining -NotNull  -Array 
      $ReferenceFields = $FieldInfo.Where({$_.IsReference}).Name
      Get-AtwsPSParameter -Name 'GetReferenceEntityById' -Alias 'GetRef' -SetName 'Filter','By_parameters' -Type 'String' -NotNull -ValidateSet $ReferenceFields
      Get-AtwsPSParameter -Name 'All' -SetName 'Get_all' -Type 'Switch'      
    }    
    ElseIf ($Verb -eq 'Set')
    {
      Get-AtwsPSParameter -Name 'InputObject' -SetName 'Input_Object' -Type $TypeName -Mandatory -Pipeline -NotNull -Array 
      Get-AtwsPSParameter -Name 'PassThru' -SetName 'Input_Object' -Type 'Switch'
    }
    ElseIf ($Verb -in 'New')
    {
      Get-AtwsPSParameter -Name 'InputObject' -SetName 'Input_Object' -Type $TypeName -Mandatory -Pipeline -NotNull
    }
    ElseIf ($Verb -eq 'Remove')
    {
      Get-AtwsPSParameter -Name 'InputObject' -SetName 'Input_Object' -Type $TypeName -Mandatory -Pipeline -NotNull -Array
      Get-AtwsPSParameter -Name 'Id' -SetName 'By_parameters' -Type $TypeName -Mandatory  -NotNull -Array
    }
    

    Switch ($Verb)
    {
      'Get' 
      { 
        $Fields = $FieldInfo.Where({
            $_.IsQueryable
        }) | ForEach-Object -Process {
          $_.Mandatory = $False
          $_
        }
      }
      'Set' 
      { 
        $Fields = $FieldInfo.Where({
            -Not $_.IsReadOnly
        }) | ForEach-Object -Process {
          $_.ParameterSet = 'Input_Object'
          $_
        }
      }
      'New' 
      {
        $Fields = $FieldInfo.Where({
            $_.Name -ne 'Id'
        })
      }
      default 
      {
        Return
      }

    }
    
    # Add Name alias for EntityName parameters
    $EntityNameParameter = '{0}Name' -f $Entity.Name
    Foreach ($Field in $Fields )
    {
      $Type = Switch ($Field.Type) 
      {
        'Integer' 
        {
          'Int'
        }
        'Short'   
        {
          'Int16'
        }
        default   
        {
          $Field.Type
        }
      }

      # Fieldtype for picklists
      If ($Field.IsPickList -and $Field.PicklistValues.Count -gt 0)
      {
        $Type = 'String'
      }
      
      $Alias = @() 
      If ($Field.Name -eq $EntityNameParameter)
      {
        $Alias += 'Name'
      }

      $ParameterOptions = @{
        Mandatory              = $Field.Mandatory
        ParameterSetName       = $Field.ParameterSet
        ValidateNotNullOrEmpty = $True
        ValidateLength         = $Field.Length
        ValidateSet            = $Field.PickListValues.Label
        Array                  = $(($Verb -eq 'Get'))
        Name                   = $Field.Name
        Alias                  = $Alias
        Type                   = $Type
      }

      Get-AtwsPSParameter @ParameterOptions
    }
    
    
    # Make modifying operators possible
    If ($Verb -eq 'Get')
    {
      # These operators work for all fields (add quote characters here)
      $Labels = $Fields | ForEach-Object -Process {
        $_ = "'{0}'" -F $_
      }
      Foreach ($Operator in 'NotEquals', 'GreaterThan', 'GreaterThanOrEqual', 'LessThan', 'LessThanOrEquals')
      {
        Get-AtwsPSParameter -Name $Operator -SetName 'By_parameters' -Type 'String' -Array -ValidateSet $Labels.Name
      }

      # These operators only work for strings (add quote characters here)
      $Labels = $Fields |
      Where-Object -FilterScript {
        $_.Type -eq 'string'
      } |
      ForEach-Object -Process {
        $_ = "'{0}'" -F $_
      }
      Foreach ($Operator in 'Like', 'NotLike', 'BeginsWith', 'EndsWith', 'Contains')
      {
        Get-AtwsPSParameter -Name $Operator -SetName 'By_parameters' -Type 'String' -Array -ValidateSet $Labels.Name
      }
    }
  }
}