Skip to content
This repository was archived by the owner on Jul 10, 2020. It is now read-only.
This repository was archived by the owner on Jul 10, 2020. It is now read-only.

Implement auto generation for blockchain provider for Swift #110

Description

@vikmeup

Define a protocol that could be described in JSON structure to automate generation of the provider and all the models. Based on your JSON code, you should be able to generate current Swift code.

It has to be extendable and support many formats for models and routes and use Moya provider as networking layer.

Example in TypeScript: https://github.com/trustwallet/web-core/blob/master/packages/rpc/src/cosmos/CosmosRPC.ts

Additional:

  • Use any language/tools that's most suitable for this problem.
  • In the future current code will require to generate templates to different languages in Java/Javascript and etc plan accordingly

Provider:

import Foundation
import Moya

enum WavesRPC {
    case balance(address: String)
    case transaction(String)
    case broadcast(Data)
    case nodeInfo
}

extension WavesRPC: TargetType {
    var baseURL: URL {
        return "https://waves-url.com"
    }

    var path: String {
        switch self {
        case .balance(let address):
            return "/addresses/balance/\(address)/0"
        case .transaction(let hash):
            return "/transactions/info/\(hash)"
        case .broadcast:
            return "/transactions/broadcast"
        case .nodeInfo:
            return "/node/status"
        }
    }

    var method: Moya.Method {
        switch self {
        case .balance, .transaction, .nodeInfo:
            return .get
        case .broadcast:
            return .post
        }
    }

    var sampleData: Data {
        return Data()
    }

    var task: Task {
        switch self {
        case .balance, .transaction, .nodeInfo:
            return .requestPlain
        case .broadcast(let data):
            return Task.requestData(data)
        }
    }

    var headers: [String: String]? {
        return [
            "content-type": "application/json",
        ]
    }
}

Models

struct WavesBalance: Codable {
    let balance: Int64
}

struct WavesSentTransaction: Codable {
    let id: String
}

struct WavesRPCError: Codable {
    let error: Int
    let message: String
}

struct WavesTransactionInfo: Codable {
    let height: Int64
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions