sdk/communication/AzureCommunicationChat/Source/Serializer/IdentifierSerializer.swift (115 lines of code) (raw):

// -------------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // The MIT License (MIT) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the ""Software""), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // // -------------------------------------------------------------------------- import AzureCommunicationCommon import AzureCore import Foundation internal enum IdentifierSerializer { static func deserialize(identifier: CommunicationIdentifierModelInternal) throws -> CommunicationIdentifier { guard let rawId = identifier.rawId else { throw AzureError.client("Can't serialize CommunicationIdentifierModel: rawId is undefined.") } try assertOneNestedModel(identifier) if let communicationUser = identifier.communicationUser { return CommunicationUserIdentifier(communicationUser.id) } else if let phoneNumber = identifier.phoneNumber { return PhoneNumberIdentifier(phoneNumber: phoneNumber.value, rawId: rawId) } else if let microsoftTeamsUser = identifier.microsoftTeamsUser { guard let isAnonymous = microsoftTeamsUser.isAnonymous else { throw AzureError.client("Can't serialize CommunicationIdentifierModel: isAnonymous is undefined.") } guard let cloud = microsoftTeamsUser.cloud else { throw AzureError.client("Can't serialize CommunicationIdentifierModel: cloud is undefined.") } return MicrosoftTeamsUserIdentifier( userId: microsoftTeamsUser.userId, isAnonymous: isAnonymous, rawId: rawId, cloudEnvironment: try deserialize(model: cloud) ) } return UnknownIdentifier(rawId) } private static func deserialize(model: CommunicationCloudEnvironmentModel) throws -> CommunicationCloudEnvironment { if model == CommunicationCloudEnvironmentModel.public { return CommunicationCloudEnvironment.Public } if model == CommunicationCloudEnvironmentModel.gcch { return CommunicationCloudEnvironment.Gcch } if model == CommunicationCloudEnvironmentModel.dod { return CommunicationCloudEnvironment.Dod } return CommunicationCloudEnvironment(environmentValue: model.requestString) } static func assertOneNestedModel(_ identifier: CommunicationIdentifierModelInternal) throws { var presentProperties = 0 if identifier.communicationUser != nil { presentProperties += 1 } if identifier.phoneNumber != nil { presentProperties += 1 } if identifier.microsoftTeamsUser != nil { presentProperties += 1 } if presentProperties > 1 { throw AzureError.client("Only one property should be present") } } static func serialize(identifier: CommunicationIdentifier) throws -> CommunicationIdentifierModelInternal { switch identifier { case let user as CommunicationUserIdentifier: return CommunicationIdentifierModelInternal( rawId: nil, communicationUser: CommunicationUserIdentifierModel( id: user .identifier ), phoneNumber: nil, microsoftTeamsUser: nil ) case let phoneNumber as PhoneNumberIdentifier: return CommunicationIdentifierModelInternal( rawId: phoneNumber.rawId, communicationUser: nil, phoneNumber: PhoneNumberIdentifierModel(value: phoneNumber.phoneNumber), microsoftTeamsUser: nil ) case let teamsUser as MicrosoftTeamsUserIdentifier: return try CommunicationIdentifierModelInternal( rawId: teamsUser.rawId, communicationUser: nil, phoneNumber: nil, microsoftTeamsUser: MicrosoftTeamsUserIdentifierModel( userId: teamsUser.userId, isAnonymous: teamsUser .isAnonymous, cloud: serialize( cloud: teamsUser .cloudEnviroment ) ) ) case let unknown as UnknownIdentifier: return CommunicationIdentifierModelInternal( rawId: unknown.identifier, communicationUser: nil, phoneNumber: nil, microsoftTeamsUser: nil ) default: throw AzureError.client("CommunicationIdentifier is not supported and cannot be serialized") } } private static func serialize(cloud: CommunicationCloudEnvironment) throws -> CommunicationCloudEnvironmentModel { if cloud == CommunicationCloudEnvironment.Public { return CommunicationCloudEnvironmentModel.public } if cloud == CommunicationCloudEnvironment.Gcch { return CommunicationCloudEnvironmentModel.gcch } if cloud == CommunicationCloudEnvironment.Dod { return CommunicationCloudEnvironmentModel.dod } return CommunicationCloudEnvironmentModel(cloud.getEnvironmentValue()) } }