TeraGeneratedRecoveryInventory.swift (2146B)
1 import TeraKitBindings 2 3 extension TeraGeneratedRuntimeBackend { 4 func recoveryPage(limit: UInt16, cursor: String?) async throws -> TeraRecoveryPage { 5 do { 6 let value = try await runtime.recoveryPage(schemaVersion: 1, limit: limit, cursor: cursor) 7 guard value.schemaVersion == 1, limit > 0, limit <= 64, value.scanned <= limit, 8 value.entries.count <= Int(value.scanned), Self.recoveryHex(value.author, count: 64), 9 value.nextCursor?.isEmpty != true else { throw TeraComposerAcknowledgment.unconfirmed } 10 let entries = try value.entries.map(Self.recoveryEntry) 11 guard Set(entries.map(\.key)).count == entries.count, 12 entries.map(\.key) == entries.map(\.key).sorted() else { throw TeraComposerAcknowledgment.unconfirmed } 13 return TeraRecoveryPage(author: value.author, entries: entries, scanned: value.scanned, nextCursor: value.nextCursor) 14 } catch { throw TeraGeneratedRuntimeFailure.from(error) } 15 } 16 17 func recoveryParent(key: String) async throws -> TeraRecoveryEntry? { 18 do { 19 guard let value = try await runtime.recoveryParent(schemaVersion: 1, key: key) else { return nil } 20 let entry = try Self.recoveryEntry(value) 21 guard entry.key == key else { throw TeraComposerAcknowledgment.unconfirmed } 22 return entry 23 } catch { throw TeraGeneratedRuntimeFailure.from(error) } 24 } 25 26 private static func recoveryEntry(_ value: FfiRecoveryEntry) throws -> TeraRecoveryEntry { 27 guard value.schemaVersion == 1, recoveryHex(value.key, count: 32), 28 value.revision > 0, value.revision <= UInt64(Int64.max) else { throw TeraComposerAcknowledgment.unconfirmed } 29 let owner: TeraRecoveryOwner = switch value.owner { 30 case .legacy: .legacy 31 case let .submission(request): try .submission(TeraGeneratedSubmission.request(request)) 32 case .repair: .repair 33 } 34 return TeraRecoveryEntry(key: value.key, revision: value.revision, owner: owner) 35 } 36 37 private static func recoveryHex(_ value: String, count: Int) -> Bool { 38 value.utf8.count == count && value.utf8.allSatisfy { (48 ... 57).contains($0) || (97 ... 102).contains($0) } 39 } 40 }