src/cmdlets/common/GraphOutputFile.ps1

# Copyright 2019, 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 GraphOutputFile {
    $baseName = $null
    $fileContent = $null
    $contentTypeData = $null

    function __initialize($baseName, $fileContent, $contentTypeData) {
        if ( ! $baseName ) {
            throw "A base file name must be specified."
        }

        $this.baseName = $baseName
        $this.fileContent = $fileContent
        $this.contentTypeData = $contentTypeData
    }

    function Save {
        $typeData = __GetTypeData

        $destinationPath = "$($this.baseName).$($typeData.Extension)"

        write-verbose "Saving result to file path = '$destinationPath'; isBinary=$($typeData.IsBinary); extension = '$($typeData.extension)'; encoding = '$($typeData.encoding)'"

        if ( $typeData.IsBinary ) {
            __SaveBinary $destinationPath
        } else {
            __SaveText $destinationPath $typeData.encoding
        }

        get-item $destinationPath
    }

    function __GetTypeData {
        $isBinary = $false
        $extension = '.dat'
        $encoding = 'Default'

        if ( $this.contentTypeData['application/json'] ) {
            $isBinary = $false
            $extension = 'json'
            $charset = $this.contentTypeData['charset']
            if ( $charset -eq 'utf-8') {
                $encoding = 'UTF8'
            } else {
                $encodig = 'Default'
            }
        } elseif ( $this.contentTypeData['image/jpeg'] ) {
            $isBinary = $true
            $extension = 'jpg'
            $encoding = 'Byte'
        }

        $result = @{Extension = $extension;IsBinary = $isBinary; Encoding = $encoding}

        [PSCustomObject] $result
    }

    function __SaveBinary($path) {
        $encodingArgument = if ( $PSVersionTable.PSEdition -eq 'Desktop' ) {
            @{Encoding='Byte'}
        } else {
            @{AsByteStream=(. {param([switch] $switchVal) $switchValval} -switchVal)}
        }

        set-content -path $path -value $this.fileContent @encodingArgument
    }

    function __SaveText($path, $encoding) {
        set-content -path $path -value $this.fileContent -Encoding $encoding
    }
}