src/typesystem/TypeDefinition.ps1

# Copyright 2020, Adam Edwards
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

ScriptClass TypeDefinition {
    . {}.module.newboundscriptblock($::.TypeSchema.EnumScript)

    $TypeId = $null
    $BaseType = $null
    $Name = $null
    $Namespace = $null
    $Properties = $null
    $NavigationProperties = $null
    $Class = $null
    $IsComposite = $false
    $DefaultValue = $null
    $DefaultCollectionValue = $null
    $NativeSchema = $null

    function __initialize($typeId, [GraphTypeClass] $class, $name, $namespace, $baseType, $properties, $defaultValue, $defaultCollectionValue, $isComposite, $nativeSchema, $navigationProperties) {
        if ( $class -eq 'Unknown' ) {
            throw [ArgumentException]::new("Error creating definition for type '$typeId': the specified type class 'Unknown' is not valid -- the type must be Enumeration, Complex, Primitive, or Entity")
        }

        $this.TypeId = $typeId
        $this.Class = $class
        $this.BaseType = $baseType
        $this.Name = $name
        $this.Properties = @()
        $this.NavigationProperties = @()
        $this.Namespace = $namespace
        $this.IsComposite = $IsComposite
        $this.DefaultValue = $defaultValue
        $this.DefaultCollectionValue = $defaultCollectionValue
        $this.NativeSchema = $nativeSchema

        # Also, we only assign to them if the values are not null or empty -- in either case,
        # if we return '@()' in an if statement, it gets converted to $nuill on assignment (!) which is not what we want. So we init these
        # members to the desired value of @() and then assign to them only if there's something to assign.
        if ( $Properties ) {
            # Ensure that these members are *ALWAYS* arrays by overriding some PowerShell semantics with singleton arrays via ','
            $this.Properties = if ( ! $properties -or $properties.GetType().IsArray ) { $properties } else { , @($properties) }
        }
        if ( $NavigationProperties ) {
            # See the singleton override workaround for the same case above for Properties
            $this.NavigationProperties = if ( ! $navigationProperties -or $navigationProperties.GetType().IsArray ) { $navigationProperties } else { , @($navigationProperties) }
        }
    }
}