Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FLW-1970: fixed long time types resolve #69

Merged
merged 2 commits into from
Jun 20, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 30 additions & 13 deletions FearlessUtils/Classes/Runtime/Metadata/Schema/RuntimeSchema.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,25 @@ public struct Schema: ScaleCodable {

extension Schema {
public final class Resolver {

// MARK: - Private properties
private struct TypeResolved {
let metadata: TypeMetadata?
}

private let schema: Schema?
private var resolvedTypes: [String: TypeResolved] = [:]

// MARK: - Constructor
public init(schema: Schema?) {
self.schema = schema
if let mappedSchema = try? mapSchemaToDictionary() {
self.resolvedTypes = mappedSchema
}
}

private var resolvedTypes: [String: TypeResolved] = [:]

// MARK: - Public methods
public func resolveType(json: JSON) throws -> TypeMetadata? {
guard let string = json.stringValue else { return nil }

Expand All @@ -45,21 +53,11 @@ extension Schema {
}

public func resolveType(name: String) throws -> TypeMetadata? {
if let type = resolvedTypes[name] {
return type.metadata
}

var metadata: TypeMetadata? = nil
if let items = schema?.types {
for item in items {
if try typeName(for: item.type) == name {
metadata = item.type
break
}
}
if let type = resolvedTypes[name] {
metadata = type.metadata
}

resolvedTypes[name] = TypeResolved(metadata: metadata)
return metadata
}

Expand Down Expand Up @@ -92,6 +90,25 @@ extension Schema {
return name
}

// MARK: - Private methods

private func mapSchemaToDictionary() throws -> [String: TypeResolved] {
var result = [String: TypeResolved]()
guard let items = schema?.types else {
return result
}
do {
let mappedSchema = try items.reduce([String: TypeResolved]()) { (dict, schemaItem) -> [String: TypeResolved] in
var dict = dict
let key = try typeName(for: schemaItem.type)
dict[key] = TypeResolved(metadata: schemaItem.type)
return dict
}
result = mappedSchema
}
return result
}

private var ignoredGenericTypes: [String] {
[KnownType.address.name] + ExtrinsicCheck.allCases.map { $0.rawValue }
}
Expand Down