mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 12:17:58 +00:00
05ced83f74
* restructure cli commands * config: Add `SkipCheckIfFeeless` signed extension (#1264) * config: Add `SkipCheckIfFeeless` signed extension Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Add extra extension to the default params Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * examples: Adjust signed extension example Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Extend SkipCheckIfFeeless with inner signed extension Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Configure SkipCheck with inner signed extension params Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Implement Deafult for SkipCheckIfFeelessParams with Option Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * examples: Fix example with proper extension Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Extend <T as Config>::AssetId with EncodeAsType and Clone Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Add SkipCheck with AssetTx Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Encode as type from metadata the inner signed extensions Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Adjust examples Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * blocks: Use `SkipCheckIfFeeless` for decoding the tip of extensions Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Decode `SkipCheckIfFeeless` with `Self` Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * tests: Adjust testing Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Descriptive errors for building `SkipCheckIfFeeless` Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Add docs for extra error types Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Add extra derives to signed extensions Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * config: Use `Default::default` to simplify type init Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Replace removed lint (#1270) Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Add support for multi-chain usecase (#1238) * lightclient: Make `smoldot::chainID` part of the RPC requests Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Make `BackgroundTask` generic over `PlatformRef` and chain Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Construct from raw smoldot and target different chains Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * testing: Update cargo lock for wasm tests Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Reuse `new_from_client` method and removed unused imports Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Reexport smoldot client and RPC objects used in pub interface Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Adjust `new_from_client` interface Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Extend background to poll over multiple RPC objects Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Build light client from raw and target different chains Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Add demo chain specs Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Move artifacts to dedicated folder Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Use SelectAll to drive all streams Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Fetch initial data from the target chain Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Reexport other smoldot objects Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Target chain with potentially different config Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt/rpc: Log chainID for debugging Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt/examples: Add smoldot client with parachain example Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Propagate chain ID together with rpc responses object Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Multiplex responses by request ID and chain ID Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Add raw light client builder Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Add cargo feature flag for parachains example Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Derive default for internal structure Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Guard reexports by std feature flag Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update subxt/src/client/light_client/mod.rs Co-authored-by: James Wilson <james@jsdw.me> * lightclient: Update the builder pattern and chain targetting Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Fix documentation Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Provide more insightful docs wrt native/wasm panics Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * examples: Adjust comment location Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Refactor UniqueChainId into the background task Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update lightclient/src/background.rs Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> * Update subxt/src/client/light_client/builder.rs Co-authored-by: James Wilson <james@jsdw.me> * lightclient: Update docs wrt panics Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Update docs wrt to smoldot instance -> client Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Use IntoIter instead of Iterator Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Adjsut docs wrt [`Self::new_from_client`] Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Remove RawRpc from LightClient in favor of chainID Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Reexport everything under smoldot module Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Use stateRootHash instead of genesis.raw Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: James Wilson <james@jsdw.me> Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> * Bump futures from 0.3.28 to 0.3.29 (#1272) Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.28 to 0.3.29. - [Release notes](https://github.com/rust-lang/futures-rs/releases) - [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.28...0.3.29) --- updated-dependencies: - dependency-name: futures dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump zeroize from 1.6.0 to 1.7.0 (#1274) Bumps [zeroize](https://github.com/RustCrypto/utils) from 1.6.0 to 1.7.0. - [Commits](https://github.com/RustCrypto/utils/commits) --- updated-dependencies: - dependency-name: zeroize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tracing-subscriber from 0.3.17 to 0.3.18 (#1275) Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.17 to 0.3.18. - [Release notes](https://github.com/tokio-rs/tracing/releases) - [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.17...tracing-subscriber-0.3.18) --- updated-dependencies: - dependency-name: tracing-subscriber dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tracing-subscriber from 0.3.17 to 0.3.18 (#1275) Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.17 to 0.3.18. - [Release notes](https://github.com/tokio-rs/tracing/releases) - [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.17...tracing-subscriber-0.3.18) --- updated-dependencies: - dependency-name: tracing-subscriber dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump getrandom from 0.2.10 to 0.2.11 (#1273) Bumps [getrandom](https://github.com/rust-random/getrandom) from 0.2.10 to 0.2.11. - [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-random/getrandom/compare/v0.2.10...v0.2.11) --- updated-dependencies: - dependency-name: getrandom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * impl RpcClientT for Arc<T> and Box<T> (#1277) * impl RpcClientT for Arc<WsClient> * fix grumbles: impl for Box<T> and Arc<T> * grumbles: move RpcClientT impls * first iteration of using scale_typegen * introduce indoc for formatting * calls, constants and home are cleaner now * added event subcommand * show runtime apis working * add better code formatting * fix style * adjust tests, use owo_colorize to not add extra dependency * fmt * adjust docs * move scale-typegen-description dependency to workspace * improve `substrate-compat` (#1265) * improve `substrate-compat` * From => Into --------- Co-authored-by: James Wilson <james@jsdw.me> * Bump proc-macro2 from 1.0.69 to 1.0.70 (#1292) Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.69 to 1.0.70. - [Release notes](https://github.com/dtolnay/proc-macro2/releases) - [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.69...1.0.70) --- updated-dependencies: - dependency-name: proc-macro2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump serde from 1.0.192 to 1.0.193 (#1291) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.192 to 1.0.193. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.192...v1.0.193) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * lightclient: Fix wasm socket closure called after being dropped (#1289) * lightclient: Close wasm socket while dropping from connecting state Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Construct one time only closures Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * testing: Enable console logs for lightclient WASM testing Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Separate wakes and check connectivity on poll_read Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Close the socket depending on internal state Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Revert "lightclient: Separate wakes and check connectivity on poll_read" This reverts commit 866094001d4c0b119a80ed681a74b323f74eae1b. * lightclient: Return pending if socket is opening from poll_read Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Close the socket on `poll_close` Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Reset closures on Drop to avoid recursive invokation Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Close the socket if not already closing Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * workflows: Install rustup component for building substrate (#1295) Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Command to fetch chainSpec and optimise its size (#1278) * cli: Add chainSpec command Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli/chainSpec: Move to dedicated module Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Compute the state root hash Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Remove code substitutes Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Update polkadot.json Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * scripts: Generate the chain spec Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Remove testing artifacts Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Fix clippy Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Apply rustfmt Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Introduce feature flag for smoldot dependency Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli: Rename chain-spec to chain-spec-pruning Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * scripts: Update chain-spec command Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * update to new scale-typegen interfaces * use released version of scale-typegen * Merge branch 'master' into tadeohepperle/cli-support-runtime-apis * remove unused debug file * resolve merge errors * adjustments * constants file adjustment * method renaming * fix issue with encoding runtime api params * Add logging to submit_transaction and unstable driver, and ensure unpin evs complete * panic if None returned from subscription too, also with stats * change panic to Err just to be on the safe side * clippy * make long tests run only after clippy + fmt pass * megre in light client test change pr * chore(subxt/src): typo fix (#1370) * rpcmethods * followstr * mod and else * Weekly Cronjob fetching artifacts and generating polkadot.rs file. (#1352) * github CI action cronjob * add commit message * fix the CI yml files * binary crate for CI script with substrate-runner * update the CI script * correct the artifacts script * remove bash script * lightclient(fix): Ensure lightclient chainSpec is at least one block old (#1372) * testing(fix): Ensure lightclient chainSpec is at least one block old Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Revert "testing(fix): Ensure lightclient chainSpec is at least one block old" This reverts commit 0eafcb2ca59d1f1cd2cef86b770f5a0401cce59f. * lightclient(fix): Ensure lightclient chainSpec is at least one block old Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Link smoldot issue Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Use tokio under lightclient feature flag Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Do not sleep on errors to fetch the chainSpec Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Remove test file Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * lightclient: Subscribe to two finalized blocks Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Revert cargo toml Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * ci: Reduce the light client timeout to 15 minutes (#1373) * ci: Reduce the light client timpeut to 15 seconds Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * ci: Use ubuntu-latest for light-client tests Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * actually only wait for machete+fmt, clippy can be much slower * update CI file from Alex PR * resolve clippy err * Try a few RPC nodes in case one of them is not working * fix submit_transaction debug logging of message * Improve Signed Extension and Block Decoding Examples/Book (#1357) * asset hub example and book adjustment * formatting * recursive derives * polkadot monitor example and book adjustments * formatting * adjust docs and examples, add dynamic example * james suggestions * fmt * chore(subxt/src): typo fix (#1370) * rpcmethods * followstr * mod and else * Weekly Cronjob fetching artifacts and generating polkadot.rs file. (#1352) * github CI action cronjob * add commit message * fix the CI yml files * binary crate for CI script with substrate-runner * update the CI script * correct the artifacts script * remove bash script --------- Co-authored-by: James Wilson <james@jsdw.me> Co-authored-by: Pan chao <152830401+Pan-chao@users.noreply.github.com> * fix formatting of returned sections * make storage use execute flag as well --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: James Wilson <james@jsdw.me> Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: yjh <yjh465402634@gmail.com> Co-authored-by: Pan chao <152830401+Pan-chao@users.noreply.github.com>
372 lines
11 KiB
Rust
372 lines
11 KiB
Rust
// Copyright 2019-2023 Parity Technologies (UK) Ltd.
|
|
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
|
// see LICENSE for license details.
|
|
|
|
use clap::Args;
|
|
use color_eyre::eyre::{bail, eyre};
|
|
use color_eyre::owo_colors::OwoColorize;
|
|
use heck::ToUpperCamelCase;
|
|
use scale_info::PortableRegistry;
|
|
use scale_typegen_description::{format_type_description, type_description};
|
|
use std::fmt::Display;
|
|
use std::str::FromStr;
|
|
use std::{fs, io::Read, path::PathBuf};
|
|
use subxt::{OnlineClient, PolkadotConfig};
|
|
|
|
use scale_value::Value;
|
|
use subxt_codegen::fetch_metadata::{fetch_metadata_from_url, MetadataVersion, Url};
|
|
|
|
/// The source of the metadata.
|
|
#[derive(Debug, Args, Clone)]
|
|
pub struct FileOrUrl {
|
|
/// The url of the substrate node to query for metadata for codegen.
|
|
#[clap(long, value_parser)]
|
|
pub url: Option<Url>,
|
|
/// The path to the encoded metadata file.
|
|
#[clap(long, value_parser)]
|
|
pub file: Option<PathOrStdIn>,
|
|
/// Specify the metadata version.
|
|
///
|
|
/// - "latest": Use the latest stable version available.
|
|
/// - "unstable": Use the unstable metadata, if present.
|
|
/// - a number: Use a specific metadata version.
|
|
///
|
|
/// Defaults to asking for the latest stable metadata version.
|
|
#[clap(long)]
|
|
pub version: Option<MetadataVersion>,
|
|
}
|
|
|
|
impl FromStr for FileOrUrl {
|
|
type Err = &'static str;
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
if let Ok(path) = PathOrStdIn::from_str(s) {
|
|
Ok(FileOrUrl {
|
|
url: None,
|
|
file: Some(path),
|
|
version: None,
|
|
})
|
|
} else {
|
|
Url::parse(s)
|
|
.map_err(|_| "Parsing Path or Uri failed.")
|
|
.map(|uri| FileOrUrl {
|
|
url: Some(uri),
|
|
file: None,
|
|
version: None,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
/// If `--path -` is provided, read bytes for metadata from stdin
|
|
const STDIN_PATH_NAME: &str = "-";
|
|
#[derive(Debug, Clone)]
|
|
pub enum PathOrStdIn {
|
|
Path(PathBuf),
|
|
StdIn,
|
|
}
|
|
|
|
impl FromStr for PathOrStdIn {
|
|
type Err = &'static str;
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
let s = s.trim();
|
|
if s == STDIN_PATH_NAME {
|
|
Ok(PathOrStdIn::StdIn)
|
|
} else {
|
|
let path = std::path::Path::new(s);
|
|
if path.exists() {
|
|
Ok(PathOrStdIn::Path(PathBuf::from(path)))
|
|
} else {
|
|
Err("Path does not exist.")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl FileOrUrl {
|
|
/// Fetch the metadata bytes.
|
|
pub async fn fetch(&self) -> color_eyre::Result<Vec<u8>> {
|
|
match (&self.file, &self.url, self.version) {
|
|
// Can't provide both --file and --url
|
|
(Some(_), Some(_), _) => {
|
|
bail!("specify one of `--url` or `--file` but not both")
|
|
}
|
|
// Load from --file path
|
|
(Some(PathOrStdIn::Path(path)), None, None) => {
|
|
let mut file = fs::File::open(path)?;
|
|
let mut bytes = Vec::new();
|
|
file.read_to_end(&mut bytes)?;
|
|
Ok(bytes)
|
|
}
|
|
(Some(PathOrStdIn::StdIn), None, None) => {
|
|
let res = std::io::stdin().bytes().collect::<Result<Vec<u8>, _>>();
|
|
|
|
match res {
|
|
Ok(bytes) => Ok(bytes),
|
|
Err(err) => bail!("reading bytes from stdin (`--file -`) failed: {err}"),
|
|
}
|
|
}
|
|
// Cannot load the metadata from the file and specify a version to fetch.
|
|
(Some(_), None, Some(_)) => {
|
|
// Note: we could provide the ability to convert between metadata versions
|
|
// but that would be involved because we'd need to convert
|
|
// from each metadata to the latest one and from the
|
|
// latest one to each metadata version. For now, disable the conversion.
|
|
bail!("`--file` is incompatible with `--version`")
|
|
}
|
|
// Fetch from --url
|
|
(None, Some(uri), version) => {
|
|
Ok(fetch_metadata_from_url(uri.clone(), version.unwrap_or_default()).await?)
|
|
}
|
|
// Default if neither is provided; fetch from local url
|
|
(None, None, version) => {
|
|
let url = Url::parse("ws://localhost:9944").expect("Valid URL; qed");
|
|
Ok(fetch_metadata_from_url(url, version.unwrap_or_default()).await?)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// creates an example value for each of the fields and
|
|
/// packages all of them into one unnamed composite value.
|
|
pub fn fields_composite_example(
|
|
fields: impl Iterator<Item = u32>,
|
|
types: &PortableRegistry,
|
|
) -> Value {
|
|
let examples: Vec<Value> = fields.map(|e| type_example(e, types)).collect();
|
|
Value::unnamed_composite(examples)
|
|
}
|
|
|
|
/// Returns a field description that is already formatted.
|
|
pub fn fields_description(
|
|
fields: &[(Option<&str>, u32)],
|
|
name: &str,
|
|
types: &PortableRegistry,
|
|
) -> String {
|
|
if fields.is_empty() {
|
|
return "Zero Sized Type, no fields.".to_string();
|
|
}
|
|
let all_named = fields.iter().all(|f| f.0.is_some());
|
|
|
|
let fields = fields
|
|
.iter()
|
|
.map(|field| {
|
|
let field_description =
|
|
type_description(field.1, types, false).expect("No Description.");
|
|
if all_named {
|
|
let field_name = field.0.unwrap();
|
|
format!("{field_name}: {field_description}")
|
|
} else {
|
|
field_description.to_string()
|
|
}
|
|
})
|
|
.collect::<Vec<String>>()
|
|
.join(",");
|
|
|
|
let name = name.to_upper_camel_case();
|
|
let end_result = if all_named {
|
|
format!("{name} {{{fields}}}")
|
|
} else {
|
|
format!("{name} ({fields})")
|
|
};
|
|
// end_result
|
|
format_type_description(&end_result).highlight()
|
|
}
|
|
|
|
pub fn format_scale_value<T>(value: &Value<T>) -> String {
|
|
scale_typegen_description::format_type_description(&value.to_string()).highlight()
|
|
}
|
|
|
|
pub fn type_example(type_id: u32, types: &PortableRegistry) -> Value {
|
|
scale_typegen_description::scale_value_from_seed(type_id, types, time_based_seed()).expect("")
|
|
}
|
|
|
|
fn time_based_seed() -> u64 {
|
|
std::time::SystemTime::now()
|
|
.duration_since(std::time::UNIX_EPOCH)
|
|
.expect("We should always live in the future.")
|
|
.subsec_millis() as u64
|
|
}
|
|
|
|
pub fn first_paragraph_of_docs(docs: &[String]) -> String {
|
|
// take at most the first paragraph of documentation, such that it does not get too long.
|
|
let docs_str = docs
|
|
.iter()
|
|
.map(|e| e.trim())
|
|
.take_while(|e| !e.is_empty())
|
|
.collect::<Vec<_>>()
|
|
.join("\n");
|
|
docs_str
|
|
}
|
|
|
|
pub trait Indent: ToString {
|
|
fn indent(&self, indent: usize) -> String {
|
|
let indent_str = " ".repeat(indent);
|
|
self.to_string()
|
|
.lines()
|
|
.map(|line| format!("{indent_str}{line}"))
|
|
.collect::<Vec<_>>()
|
|
.join("\n")
|
|
}
|
|
}
|
|
|
|
impl<T: Display> Indent for T {}
|
|
|
|
pub async fn create_client(
|
|
file_or_url: &FileOrUrl,
|
|
) -> color_eyre::Result<OnlineClient<PolkadotConfig>> {
|
|
let client = match &file_or_url.url {
|
|
Some(url) => OnlineClient::<PolkadotConfig>::from_url(url).await?,
|
|
None => OnlineClient::<PolkadotConfig>::new().await?,
|
|
};
|
|
Ok(client)
|
|
}
|
|
|
|
pub fn parse_string_into_scale_value(str: &str) -> color_eyre::Result<Value> {
|
|
let value = scale_value::stringify::from_str(str).0.map_err(|err| {
|
|
eyre!(
|
|
"scale_value::stringify::from_str led to a ParseError.\n\ntried parsing: \"{str}\"\n\n{err}",
|
|
)
|
|
})?;
|
|
Ok(value)
|
|
}
|
|
|
|
pub trait SyntaxHighlight {
|
|
fn highlight(&self) -> String;
|
|
}
|
|
|
|
impl<T: AsRef<str>> SyntaxHighlight for T {
|
|
fn highlight(&self) -> String {
|
|
let _e = 323.0;
|
|
let mut output: String = String::new();
|
|
let mut word: String = String::new();
|
|
|
|
let mut in_word: Option<InWord> = None;
|
|
|
|
for c in self.as_ref().chars() {
|
|
match c {
|
|
'{' | '}' | ',' | '(' | ')' | ':' | '<' | '>' | ' ' | '\n' | '[' | ']' | ';' => {
|
|
// flush the current word:
|
|
if let Some(is_word) = in_word {
|
|
let word = if word == "enum" {
|
|
word.blue().to_string()
|
|
} else {
|
|
is_word.colorize(&word)
|
|
};
|
|
output.push_str(&word);
|
|
}
|
|
|
|
in_word = None;
|
|
word.clear();
|
|
// push the symbol itself:
|
|
output.push(c);
|
|
}
|
|
l => {
|
|
if in_word.is_none() {
|
|
in_word = Some(InWord::from_first_char(l))
|
|
}
|
|
word.push(l);
|
|
}
|
|
}
|
|
}
|
|
// flush if ending on a word:
|
|
if let Some(word_kind) = in_word {
|
|
output.push_str(&word_kind.colorize(&word));
|
|
}
|
|
|
|
return output;
|
|
|
|
enum InWord {
|
|
Lower,
|
|
Upper,
|
|
Number,
|
|
}
|
|
|
|
impl InWord {
|
|
fn colorize(&self, str: &str) -> String {
|
|
let color = match self {
|
|
InWord::Lower => (156, 220, 254),
|
|
InWord::Upper => (78, 201, 176),
|
|
InWord::Number => (181, 206, 168),
|
|
};
|
|
str.truecolor(color.0, color.1, color.2).to_string()
|
|
}
|
|
|
|
fn from_first_char(c: char) -> Self {
|
|
if c.is_numeric() {
|
|
Self::Number
|
|
} else if c.is_uppercase() {
|
|
Self::Upper
|
|
} else {
|
|
Self::Lower
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn validate_url_security(url: Option<&Url>, allow_insecure: bool) -> color_eyre::Result<()> {
|
|
let Some(url) = url else {
|
|
return Ok(());
|
|
};
|
|
match subxt::utils::url_is_secure(url.as_str()) {
|
|
Ok(is_secure) => {
|
|
if !allow_insecure && !is_secure {
|
|
bail!("URL {url} is not secure!\nIf you are really want to use this URL, try using --allow-insecure (-a)");
|
|
}
|
|
}
|
|
Err(err) => {
|
|
bail!("URL {url} is not valid: {err}")
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use crate::utils::{FileOrUrl, PathOrStdIn};
|
|
use std::str::FromStr;
|
|
|
|
#[test]
|
|
fn parsing() {
|
|
assert!(matches!(
|
|
FileOrUrl::from_str("-"),
|
|
Ok(FileOrUrl {
|
|
url: None,
|
|
file: Some(PathOrStdIn::StdIn),
|
|
version: None
|
|
})
|
|
),);
|
|
|
|
assert!(matches!(
|
|
FileOrUrl::from_str(" - "),
|
|
Ok(FileOrUrl {
|
|
url: None,
|
|
file: Some(PathOrStdIn::StdIn),
|
|
version: None
|
|
})
|
|
),);
|
|
|
|
assert!(matches!(
|
|
FileOrUrl::from_str("./src/main.rs"),
|
|
Ok(FileOrUrl {
|
|
url: None,
|
|
file: Some(PathOrStdIn::Path(_)),
|
|
version: None
|
|
})
|
|
),);
|
|
|
|
assert!(FileOrUrl::from_str("./src/i_dont_exist.rs").is_err());
|
|
|
|
assert!(matches!(
|
|
FileOrUrl::from_str("https://github.com/paritytech/subxt"),
|
|
Ok(FileOrUrl {
|
|
url: Some(_),
|
|
file: None,
|
|
version: None
|
|
})
|
|
));
|
|
}
|
|
}
|