Home

Awesome

<!-- markdownlint-disable MD014 --> <div align="center"> <h1><code>near-abi-client-rs</code></h1> <p> <strong>Library to generate Rust client code with <a href="https://github.com/near/workspaces-rs">workspaces-rs</a> from <a href="https://github.com/near/abi">ABI schemas</a> on NEAR</strong> </p> <p> <a href="https://github.com/near/near-abi-client-rs/actions/workflows/test.yml?query=branch%3Amain"><img src="https://github.com/near/near-abi-client-rs/actions/workflows/test.yml/badge.svg" alt="Github CI Build" /></a> <a href="https://crates.io/crates/near-abi-client"><img src="https://img.shields.io/crates/v/near-abi-client.svg?style=flat-square" alt="Crates.io version" /></a> <a href="https://crates.io/crates/near-abi-client"><img src="https://img.shields.io/crates/d/near-abi-client.svg?style=flat-square" alt="Downloads" /></a> </p> </div>

Release notes

Release notes and unreleased changes can be found in the CHANGELOG

Usage

This crate supports two sets of APIs for users with different needs:

Macro API

Checkout the delegator-macro example for a standalone project using macro API to get a client and use it.

To generate a struct named ClientName based on ABI located at path/to/abi.json (relative to the current file's directory):

mod mymod {
    near_abi_client::generate!(ClientName for "path/to/abi.json");
}

Placing the macro invocation inside a mod section is optional, but helps reducing unexpected behaviors such as name clashes.

Now, assuming you have a contract: near_workspaces::Contract deployed, you can make a call like this:

let contract = mymod::ClientName { contract };
let res = contract
    .my_method_name(arg1, arg2)
    .await?;

Generation API

Checkout the delegator-generation example for a standalone project using generation API to generate a client and use it.

First, we need our package to have a build.rs file that runs the generation step. The following snippet will generate the client in abi.rs under path/to/out/dir:

fn main() -> anyhow::Result<()> {
    near_abi_client::Generator::new("path/to/out/dir".into())
        .file("path/to/abi.json")
        .generate()?;
    Ok(())
}

The resulting file, however, is not included in your source set by itself. You have to include it manually; the recommended way is to create a mod with a custom path:

#[path = "path/to/out/dir/abi.rs"]
mod mymod;

Now, assuming you have a contract: near_workspaces::Contract deployed, you can make a call like this:

let contract = mymod::AbiClient { contract };
let res = contract
    .my_method_name(arg1, arg2)
    .await?;

Feel free to explore what other methods Generator has to customize the resulting code (e.g. client struct name).

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as below, without any additional terms or conditions.

License

Licensed under either of

at your option.