field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

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 }