From 47420723bc6c489f0019f172428a8deb18d069b7 Mon Sep 17 00:00:00 2001 From: Ivan Boldyrev Date: Tue, 30 Jan 2024 21:43:47 +0400 Subject: [PATCH] feat(cli): use eyre in air-cli (#808) Instead of `anyhow`, use `eyre` to reduce number of deps. The `eyre` crate is already used in `avm-server` and `fluence-keypair`. --- Cargo.lock | 2 +- tools/cli/air/Cargo.toml | 2 +- tools/cli/air/src/beautify/mod.rs | 2 +- tools/cli/air/src/data.rs | 6 +++--- tools/cli/air/src/trace/run.rs | 16 ++++++++-------- tools/cli/air/src/trace/run/data/anomaly.rs | 4 ++-- tools/cli/air/src/trace/run/data/plain.rs | 6 +++--- tools/cli/air/src/trace/run/native.rs | 4 ++-- tools/cli/air/src/trace/run/near.rs | 8 ++++---- tools/cli/air/src/trace/run/risc0.rs | 4 ++-- tools/cli/air/src/trace/run/runner.rs | 2 +- tools/cli/air/src/trace/run/wasm.rs | 4 ++-- tools/cli/air/src/trace/stats.rs | 6 +++--- tools/cli/air/src/trace/stats/report.rs | 2 +- tools/cli/air/src/trace/utils.rs | 4 ++-- 15 files changed, 36 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0fcfb65..38132a88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -465,13 +465,13 @@ dependencies = [ "air-interpreter-interface", "air-interpreter-sede", "air-test-utils", - "anyhow", "aquavm-air", "atty", "avm-data-store", "avm-interface", "bs58 0.5.0", "clap 4.4.11", + "eyre", "fluence-keypair", "itertools", "near-sdk", diff --git a/tools/cli/air/Cargo.toml b/tools/cli/air/Cargo.toml index 65f1b211..1155d707 100644 --- a/tools/cli/air/Cargo.toml +++ b/tools/cli/air/Cargo.toml @@ -19,8 +19,8 @@ air-interpreter-data = { version = "0.17.0", path = "../../../crates/air-lib/int air-interpreter-sede = { version = "0.1.0", path = "../../../crates/air-lib/interpreter-sede", default-features = false } air-test-utils = { version = "0.15.1",path = "../../../crates/air-lib/test-utils", optional = true } -anyhow = "1.0.79" clap = { version = "4.4.7", features = ["derive", "env"] } +eyre = "0.6.11" itertools = "0.10.5" semver = "1.0.21" serde = { version = "1.0.190", features = ["derive"] } diff --git a/tools/cli/air/src/beautify/mod.rs b/tools/cli/air/src/beautify/mod.rs index 50b6ee8e..d4f94b90 100644 --- a/tools/cli/air/src/beautify/mod.rs +++ b/tools/cli/air/src/beautify/mod.rs @@ -15,8 +15,8 @@ */ use air_beautifier::Beautifier; -use anyhow::{Context, Result}; use clap::Parser; +use eyre::{Context, Result}; use std::{io, path::PathBuf}; diff --git a/tools/cli/air/src/data.rs b/tools/cli/air/src/data.rs index 557b29b6..567d3ab2 100644 --- a/tools/cli/air/src/data.rs +++ b/tools/cli/air/src/data.rs @@ -14,8 +14,8 @@ * limitations under the License. */ -use anyhow::Context; use clap::Parser; +use eyre::Context; use std::path::Path; use std::path::PathBuf; @@ -78,7 +78,7 @@ pub(crate) fn to_human_readable_data(args: Args) -> Result<(), Box = load_data(&args.input)?; if data.is_empty() { - Err(anyhow::anyhow!("empty input data: {:?}", args.input))?; + Err(eyre::eyre!("empty input data: {:?}", args.input))?; } let mut runner = create_runner(args.mode.into(), &args.air_interpreter_path)?; @@ -98,7 +98,7 @@ fn init_tracing(tracing_params: &str) { fn create_runner( mode: Option, _air_interpreter_wasm_path: &Path, -) -> anyhow::Result> { +) -> eyre::Result> { #[cfg(not(feature = "wasm"))] let default_mode = Mode::Native; #[cfg(feature = "wasm")] diff --git a/tools/cli/air/src/trace/run.rs b/tools/cli/air/src/trace/run.rs index cd01002a..76c6e997 100644 --- a/tools/cli/air/src/trace/run.rs +++ b/tools/cli/air/src/trace/run.rs @@ -28,9 +28,9 @@ pub(crate) mod runner; use self::runner::AirRunner; use avm_interface::CallResults; -use anyhow::Context as _; use clap::Parser; use clap::Subcommand; +use eyre::Context as _; use fluence_keypair::KeyPair; use zeroize::Zeroize; @@ -102,7 +102,7 @@ struct Keys { } impl Keys { - fn get_keypair(&self) -> anyhow::Result { + fn get_keypair(&self) -> eyre::Result { match (self.random_key, self.ed25519_key.as_ref()) { (true, None) => Ok(KeyPair::generate_ed25519()), (false, Some(path)) => load_keypair_ed25519(path), @@ -168,7 +168,7 @@ enum Mode { Risc0, } -pub(crate) fn run(args: Args) -> anyhow::Result<()> { +pub(crate) fn run(args: Args) -> eyre::Result<()> { let tracing_json = (!args.json) as u8; #[cfg(feature = "wasm")] let global_tracing_params = if args.mode.wasm { @@ -235,7 +235,7 @@ fn create_runner( _air_interpreter_wasm_path: &Path, _air_contract_wasm_path: &Path, _max_heap_size: Option, -) -> anyhow::Result> { +) -> eyre::Result> { #[cfg(not(feature = "wasm"))] let default_mode = Mode::Native; #[cfg(feature = "wasm")] @@ -274,7 +274,7 @@ pub fn init_tracing(tracing_params: String, trace_mode: u8) { builder.init(); } } -fn read_call_results(call_results_path: Option<&Path>) -> anyhow::Result { +fn read_call_results(call_results_path: Option<&Path>) -> eyre::Result { match call_results_path { None => Ok(CallResults::default()), Some(call_results_path) => { @@ -291,18 +291,18 @@ fn read_call_results(call_results_path: Option<&Path>) -> anyhow::Result>, default: &[u8], -) -> anyhow::Result> { +) -> eyre::Result> { match data_path { None => Ok(default.to_owned()), Some(data_path) => load_data(data_path.as_ref()), } } -pub(crate) fn load_data(data_path: &Path) -> anyhow::Result> { +pub(crate) fn load_data(data_path: &Path) -> eyre::Result> { std::fs::read(data_path).with_context(|| data_path.to_string_lossy().into_owned()) } -fn load_keypair_ed25519(path: &PathBuf) -> Result { +fn load_keypair_ed25519(path: &PathBuf) -> Result { use fluence_keypair::KeyFormat; // It follows rust-peer format diff --git a/tools/cli/air/src/trace/run/data/anomaly.rs b/tools/cli/air/src/trace/run/data/anomaly.rs index 850e7ffc..1a6cf409 100644 --- a/tools/cli/air/src/trace/run/data/anomaly.rs +++ b/tools/cli/air/src/trace/run/data/anomaly.rs @@ -19,8 +19,8 @@ use super::ExecutionData; use avm_data_store::AnomalyData; use avm_interface::ParticleParameters; -use anyhow::Context; use clap::Parser; +use eyre::Context; use std::path::PathBuf; @@ -29,7 +29,7 @@ pub(crate) struct AnomalyDataArgs { anomaly_data_path: PathBuf, } -pub(crate) fn load(args: &AnomalyDataArgs) -> anyhow::Result> { +pub(crate) fn load(args: &AnomalyDataArgs) -> eyre::Result> { let anomaly_json = load_data(&args.anomaly_data_path).context("Failed to read anomaly data")?; let anomaly_data: AnomalyData<'_> = serde_json::from_slice(&anomaly_json).context("Failed to parse anomaly data")?; diff --git a/tools/cli/air/src/trace/run/data/plain.rs b/tools/cli/air/src/trace/run/data/plain.rs index 35be552f..cbc64229 100644 --- a/tools/cli/air/src/trace/run/data/plain.rs +++ b/tools/cli/air/src/trace/run/data/plain.rs @@ -18,7 +18,7 @@ use super::super::super::utils::unix_timestamp_now; use super::ExecutionData; use avm_interface::ParticleParameters; -use anyhow::Context; +use eyre::Context; use std::path::{Path, PathBuf}; @@ -46,7 +46,7 @@ pub(crate) struct PlainDataArgs { particle_id: Option, } -pub(crate) fn load(args: &PlainDataArgs) -> anyhow::Result> { +pub(crate) fn load(args: &PlainDataArgs) -> eyre::Result> { use super::super::load_data_or_default; let air_script = read_air_with_prompt(args.air_script_path.as_deref()) @@ -77,7 +77,7 @@ pub(crate) fn load(args: &PlainDataArgs) -> anyhow::Result> { }) } -fn read_air_with_prompt(air_input: Option<&Path>) -> anyhow::Result { +fn read_air_with_prompt(air_input: Option<&Path>) -> eyre::Result { use std::io::Read; let air_script = match air_input { diff --git a/tools/cli/air/src/trace/run/native.rs b/tools/cli/air/src/trace/run/native.rs index 92c84e36..4ac891a8 100644 --- a/tools/cli/air/src/trace/run/native.rs +++ b/tools/cli/air/src/trace/run/native.rs @@ -41,7 +41,7 @@ impl AirRunner for NativeAvmRunner { _tracing_output_mode: u8, keypair: &KeyPair, particle_id: String, - ) -> anyhow::Result { + ) -> eyre::Result { use air_interpreter_sede::ToSerialized; use avm_interface::into_raw_result; @@ -79,6 +79,6 @@ impl DataToHumanReadable for NativeAvmRunner { } } -pub(crate) fn create_native_avm_runner() -> anyhow::Result> { +pub(crate) fn create_native_avm_runner() -> eyre::Result> { Ok(Box::new(NativeAvmRunner {})) } diff --git a/tools/cli/air/src/trace/run/near.rs b/tools/cli/air/src/trace/run/near.rs index 92a4e1d3..96594944 100644 --- a/tools/cli/air/src/trace/run/near.rs +++ b/tools/cli/air/src/trace/run/near.rs @@ -18,8 +18,8 @@ use super::runner::AirRunner; use air_interpreter_interface::InterpreterOutcome; use air_interpreter_interface::RunParameters; -use anyhow::Context; use avm_interface::raw_outcome::RawAVMOutcome; +use eyre::Context; use fluence_keypair::KeyPair; use std::path::{Path, PathBuf}; @@ -43,7 +43,7 @@ impl AirRunner for NearRunner { _tracing_output_mode: u8, keypair: &KeyPair, particle_id: String, - ) -> anyhow::Result { + ) -> eyre::Result { let key_format = keypair.key_format().into(); let secret_key_bytes = keypair.secret().expect("Failed to get secret key"); @@ -70,7 +70,7 @@ impl AirRunner for NearRunner { pub(crate) fn create_near_runner( air_contract_wasm_path: &Path, -) -> anyhow::Result> { +) -> eyre::Result> { let air_contract_wasm_path = air_contract_wasm_path.to_owned(); Ok(Box::new(NearRunner { @@ -85,7 +85,7 @@ fn execute_on_near( current_data: Vec, run_parameters: RunParameters, call_results: avm_interface::CallResults, -) -> anyhow::Result { +) -> eyre::Result { use avm_interface::into_raw_result; let run_parameters = serde_json::to_string(&run_parameters)?; diff --git a/tools/cli/air/src/trace/run/risc0.rs b/tools/cli/air/src/trace/run/risc0.rs index 82f06405..11126fc6 100644 --- a/tools/cli/air/src/trace/run/risc0.rs +++ b/tools/cli/air/src/trace/run/risc0.rs @@ -53,7 +53,7 @@ impl AirRunner for Risc0Runner { _tracing_output_mode: u8, keypair: &KeyPair, particle_id: String, - ) -> anyhow::Result { + ) -> eyre::Result { let key_format = keypair.key_format().into(); let secret_key_bytes = keypair.secret().expect("Failed to get secret key"); @@ -82,7 +82,7 @@ impl AirRunner for Risc0Runner { } } -fn execute_on_risc0(arguments: AquaVMProvingParameters) -> anyhow::Result { +fn execute_on_risc0(arguments: AquaVMProvingParameters) -> eyre::Result { use risc0_zkvm::serde::from_slice; let env = ExecutorEnv::builder().write(&arguments)?.build()?; diff --git a/tools/cli/air/src/trace/run/runner.rs b/tools/cli/air/src/trace/run/runner.rs index 575af424..549c0a63 100644 --- a/tools/cli/air/src/trace/run/runner.rs +++ b/tools/cli/air/src/trace/run/runner.rs @@ -36,7 +36,7 @@ pub(crate) trait AirRunner { tracing_output_mode: u8, key_pair: &KeyPair, particle_id: String, - ) -> anyhow::Result; + ) -> eyre::Result; } pub(crate) trait DataToHumanReadable { diff --git a/tools/cli/air/src/trace/run/wasm.rs b/tools/cli/air/src/trace/run/wasm.rs index fff62d14..adc6309c 100644 --- a/tools/cli/air/src/trace/run/wasm.rs +++ b/tools/cli/air/src/trace/run/wasm.rs @@ -39,7 +39,7 @@ impl AirRunner for WasmAvmRunner { tracing_output_mode: u8, keypair: &KeyPair, particle_id: String, - ) -> anyhow::Result { + ) -> eyre::Result { let call_tracing = self.0.call_tracing( air, prev_data, @@ -71,7 +71,7 @@ impl DataToHumanReadable for WasmAvmRunner { pub(crate) fn create_wasm_avm_runner( air_interpreter_wasm_path: &Path, max_heap_size: Option, -) -> anyhow::Result> { +) -> eyre::Result> { Ok(Box::new(WasmAvmRunner(AVMRunner::new( air_interpreter_wasm_path.to_owned(), max_heap_size, diff --git a/tools/cli/air/src/trace/stats.rs b/tools/cli/air/src/trace/stats.rs index dd5aeb09..f31b6a5f 100644 --- a/tools/cli/air/src/trace/stats.rs +++ b/tools/cli/air/src/trace/stats.rs @@ -33,7 +33,7 @@ pub(crate) struct Args { sort_stats_by_duration: bool, } -pub(crate) fn stats(mut args: Args) -> anyhow::Result<()> { +pub(crate) fn stats(mut args: Args) -> eyre::Result<()> { use std::io::Write; if !args.pretty && !args.stats { @@ -69,14 +69,14 @@ pub(crate) fn stats(mut args: Args) -> anyhow::Result<()> { Ok(()) } -fn read_logs(input: R) -> impl Iterator> { +fn read_logs(input: R) -> impl Iterator> { input.lines().filter_map(|r| match r { Ok(line) => { let line = line.trim(); if line.is_empty() { None } else { - Some(serde_json::from_str(line).map_err(anyhow::Error::from)) + Some(serde_json::from_str(line).map_err(eyre::Error::from)) } } Err(err) => Some(Err(err.into())), diff --git a/tools/cli/air/src/trace/stats/report.rs b/tools/cli/air/src/trace/stats/report.rs index db578629..c8e67882 100644 --- a/tools/cli/air/src/trace/stats/report.rs +++ b/tools/cli/air/src/trace/stats/report.rs @@ -49,7 +49,7 @@ impl StatsReport { Ok(()) } - pub(crate) fn consider(&mut self, rec: LogRecord) -> anyhow::Result<()> { + pub(crate) fn consider(&mut self, rec: LogRecord) -> eyre::Result<()> { if let Message::Close(close) = &rec.value.fields { let time_busy = parse_tracing_duration(&close.time_busy)?; *self.data.entry(rec.get_key()).or_default() += time_busy; diff --git a/tools/cli/air/src/trace/utils.rs b/tools/cli/air/src/trace/utils.rs index a7bf4174..387912ec 100644 --- a/tools/cli/air/src/trace/utils.rs +++ b/tools/cli/air/src/trace/utils.rs @@ -17,7 +17,7 @@ use std::time::Duration; // unfortunately, external crates don't seem to provide required functionality: // some do not handle floats, others do not handle suffixes -pub(crate) fn parse_tracing_duration(input: &str) -> Result { +pub(crate) fn parse_tracing_duration(input: &str) -> Result { for (suffix, scale) in [("ns", 1e-9), ("µs", 1e-6), ("ms", 1e-3), ("s", 1e0)] { if let Some(num_str) = input.strip_suffix(suffix) { if let Ok(num) = num_str.parse::() { @@ -28,7 +28,7 @@ pub(crate) fn parse_tracing_duration(input: &str) -> Result u64 {