Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalServiceKit/Subscriptions/Currencies/Currency.swift
1 views
//
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import Foundation

public enum Currency {
    public typealias Code = String
    public struct Info {
        public let code: Code
        public let name: String

        public init(code: Code, name: String) {
            self.code = code
            self.name = name
        }

        public init?(code: Code, ignoreMissingName: Bool = false) {
            if let name = Currency.name(for: code) {
                self.init(code: code, name: name)
            } else if ignoreMissingName {
                self.init(code: code, name: code)
            } else {
                return nil
            }
        }
    }

    public static func name(for code: Code) -> String? {
        Locale.current.localizedString(forCurrencyCode: code)
    }

    public static func infos(
        for codes: any Sequence<Code>,
        ignoreMissingNames: Bool,
        shouldSort: Bool,
    ) -> [Info] {
#if TESTABLE_BUILD
        owsPrecondition(Array(codes).count == Set(codes).count)
#endif
        var infos = codes.compactMap { Info(code: $0, ignoreMissingName: ignoreMissingNames) }
        if shouldSort { infos.sort { $0.name < $1.name } }
        return infos
    }

    // MARK: -

    public enum Symbol: Equatable {
        case before(String)
        case after(String)
        case currencyCode

        private static let symbols: [Currency.Code: Symbol] = [
            "USD": .before("$"),
            "AUD": .before("A$"),
            "BRL": .before("R$"),
            "GBP": .before("£"),
            "CAD": .before("CA$"),
            "CNY": .before("CN¥"),
            "EUR": .before("€"),
            "HKD": .before("HK$"),
            "INR": .before("₹"),
            "JPY": .before("¥"),
            "KRW": .before("₩"),
            "PLN": .after("zł"),
            "SEK": .after("kr"),
        ]

        public static func `for`(currencyCode: Currency.Code) -> Symbol {
            return symbols[currencyCode, default: .currencyCode]
        }
    }
}