mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.8 KiB
Swift
65 lines
1.8 KiB
Swift
// 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
|
|
}
|
|
}
|
|
}
|