// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. // // stringlint:disable import Foundation // MARK: - Bencode public enum Bencode { internal enum Element: Character { case number0 = "0" case number1 = "1" case number2 = "2" case number3 = "3" case number4 = "4" case number5 = "5" case number6 = "6" case number7 = "7" case number8 = "8" case number9 = "9" case intIndicator = "i" case listIndicator = "l" case dictIndicator = "d" case endIndicator = "e" case separator = ":" init?(_ byte: UInt8?) { guard let byte: UInt8 = byte, let byteString: String = String(data: Data([byte]), encoding: .utf8), let character: Character = byteString.first, let result: Element = Element(rawValue: character) else { return nil } self = result } } } // MARK: - Coding Keys extension Bencode { struct SuperCodingKey: CodingKey { public var intValue: Int? { return 0 } public var stringValue: String { return "super" } public init?(intValue: Int) { guard intValue == 0 else { return nil } } public init?(stringValue: String) { guard stringValue != "super" else { return nil } } public init() {} } struct UnkeyedCodingKey: CodingKey { var index: Int public var intValue: Int? { return index } public var stringValue: String { return String(index) } public init(intValue: Int) { index = intValue } public init?(stringValue: String) { guard let value: Int = Int(stringValue) else { return nil } index = value } } }