Sources/OSS/Transform/SerdeBucketVersioning.swift (180 lines of code) (raw):

import Foundation // MARK: - PutBucketVersioning extension Serde { static func serializePutBucketVersioning( _ request: inout PutBucketVersioningRequest, _ input: inout OperationInput ) throws { var xmlBody = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" xmlBody.append("<VersioningConfiguration>") if let status = request.versioningConfiguration?.status { xmlBody.append("<Status>\(status)</Status>") } xmlBody.append("</VersioningConfiguration>") input.body = .data(xmlBody.data(using: .utf8)!) } static func deserializePutBucketVersioning( _: inout PutBucketVersioningResult, _: inout OperationOutput ) throws {} } // MARK: - GetBucketVersioning extension Serde { static func serializeGetBucketVersioning( _: inout GetBucketVersioningRequest, _: inout OperationInput ) throws {} static func deserializeGetBucketVersioning( _ result: inout GetBucketVersioningResult, _ output: inout OperationOutput ) throws { let body = try Serde.deserializeXml(output.body) if let config = body["VersioningConfiguration"] as? [String: String] { let versioningConfiguration = VersioningConfiguration(status: config["Status"]) result.versioningConfiguration = versioningConfiguration } } } // MARK: - ListObjectVersions extension Serde { static func serializeListObjectVersions( _ request: inout ListObjectVersionsRequest, _ input: inout OperationInput ) throws { if let value = request.delimiter { input.parameters["delimiter"] = value } if let value = request.keyMarker { input.parameters["key-marker"] = value } if let value = request.versionIdMarker { input.parameters["version-id-marker"] = value } if let value = request.maxKeys { input.parameters["max-keys"] = String(value) } if let value = request.prefix { input.parameters["prefix"] = value } if let value = request.encodingType { input.parameters["encoding-type"] = value } } static func deserializeListObjectVersions( _ result: inout ListObjectVersionsResult, _ output: inout OperationOutput ) throws { let body: [String: Any] = try Serde.deserializeXml(output.body, "ListVersionsResult") result.name = body["Name"] as? String result.prefix = body["Prefix"] as? String result.keyMarker = body["KeyMarker"] as? String result.nextKeyMarker = body["NextKeyMarker"] as? String result.versionIdMarker = body["VersionIdMarker"] as? String result.nextVersionIdMarker = body["NextVersionIdMarker"] as? String result.encodingType = body["EncodingType"] as? String result.delimiter = body["Delimiter"] as? String result.maxKeys = (body["MaxKeys"] as? String)?.toInt() result.isTruncated = (body["IsTruncated"] as? String)?.toBool() // CommonPrefixes var commonPrefixes: [CommonPrefix]? if let commonPrefix = body["CommonPrefixes"] as? [String: String], let prefix = commonPrefix["Prefix"] { commonPrefixes = [CommonPrefix(prefix: prefix)] } else if let commonPrefix = body["CommonPrefixes"] as? [[String: String]] { commonPrefixes = [] for prefix in commonPrefix { if let _prefix = prefix["Prefix"] { commonPrefixes?.append(CommonPrefix(prefix: _prefix)) } } } result.commonPrefixes = commonPrefixes // version if let contents = body["Version"] { var objectVersions: [ObjectVersion] = [] var versions: [[String: Any]] = [] if let _contents = contents as? [[String: Any]] { versions.append(contentsOf: _contents) } else if let content = contents as? [String: Any] { versions.append(content) } for version in versions { var objectVersion = ObjectVersion() objectVersion.key = version["Key"] as? String objectVersion.versionId = version["VersionId"] as? String objectVersion.eTag = version["ETag"] as? String objectVersion.restoreInfo = version["RestoreInfo"] as? String objectVersion.storageClass = version["StorageClass"] as? String objectVersion.size = (version["Size"] as? String)?.toInt() objectVersion.lastModified = (version["LastModified"] as? String)?.toDate() objectVersion.transitionTime = (version["TransitionTime"] as? String)?.toDate() objectVersion.isLatest = (version["IsLatest"] as? String)?.toBool() if let ownerData = version["Owner"] as? [String: String] { var owner = Owner() owner.displayName = ownerData["DisplayName"] owner.id = ownerData["ID"] objectVersion.owner = owner } objectVersions.append(objectVersion) } result.versions = objectVersions } // deleteMarker if let contents = body["DeleteMarker"] { var deleteMarkers: [DeleteMarkerEntry] = [] var markers: [[String: Any]] = [] if let _contents = contents as? [[String: Any]] { markers.append(contentsOf: _contents) } else if let content = contents as? [String: Any] { markers.append(content) } for marker in markers { var deleteMarker = DeleteMarkerEntry() deleteMarker.key = marker["Key"] as? String deleteMarker.versionId = marker["VersionId"] as? String deleteMarker.lastModified = (marker["LastModified"] as? String)?.toDate() deleteMarker.isLatest = (marker["IsLatest"] as? String)?.toBool() if let ownerData = marker["Owner"] as? [String: String] { var owner = Owner() owner.displayName = ownerData["DisplayName"] owner.id = ownerData["ID"] deleteMarker.owner = owner } deleteMarkers.append(deleteMarker) } result.deleteMarkers = deleteMarkers } deserializeEncodingType(result: &result) } static func deserializeEncodingType(result: inout ListObjectVersionsResult) { guard result.encodingType == "url" else { return } result.prefix = result.prefix?.removingPercentEncoding result.delimiter = result.delimiter?.removingPercentEncoding result.nextKeyMarker = result.nextKeyMarker?.removingPercentEncoding result.keyMarker = result.keyMarker?.removingPercentEncoding if let versions = result.versions { var decodeVersions: [ObjectVersion] = [] for version in versions { var decodeVersion = version decodeVersion.key = decodeVersion.key?.removingPercentEncoding decodeVersions.append(decodeVersion) } result.versions = decodeVersions } if let deleteMarkers = result.deleteMarkers { var decodeDeleteMarkers: [DeleteMarkerEntry] = [] for deleteMarker in deleteMarkers { var decodeDeleteMarker = deleteMarker decodeDeleteMarker.key = decodeDeleteMarker.key?.removingPercentEncoding decodeDeleteMarkers.append(decodeDeleteMarker) } result.deleteMarkers = decodeDeleteMarkers } if let commonPrefixes = result.commonPrefixes { var decodeCommonPrefixes: [CommonPrefix] = [] for commonPrefix in commonPrefixes { var decodeCommonPrefix = commonPrefix decodeCommonPrefix.prefix = decodeCommonPrefix.prefix?.removingPercentEncoding decodeCommonPrefixes.append(decodeCommonPrefix) } result.commonPrefixes = decodeCommonPrefixes } } }