diff --git a/src/sdk/src/crypto/util.rs b/src/sdk/src/crypto/util.rs index 626030b3c..15e7dbfd7 100644 --- a/src/sdk/src/crypto/util.rs +++ b/src/sdk/src/crypto/util.rs @@ -107,10 +107,7 @@ pub trait FieldElemAsStr: PrimeField { let mut bytes = decode_hex_arr(hex)?; bytes.reverse(); - match Self::from_repr(bytes).into() { - Some(v) => Ok(v), - None => Err(ContractError::HexFmtErr), - } + Option::from(Self::from_repr(bytes)).ok_or(ContractError::HexFmtErr) } } diff --git a/src/sdk/src/hex.rs b/src/sdk/src/hex.rs index ee9b6e31a..9b1747fb0 100644 --- a/src/sdk/src/hex.rs +++ b/src/sdk/src/hex.rs @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -use crate::{ContractError, GenericResult}; +use crate::{util::Itertools, ContractError, GenericResult}; /// Creates a hex formatted string of the data #[inline] @@ -66,7 +66,7 @@ impl<'a> Iterator for HexDecodeIter<'a> { } pub fn decode_hex_arr(hex: &str) -> GenericResult<[u8; N]> { - let decoded = decode_hex(hex).collect::>>()?; + let decoded: Vec<_> = decode_hex(hex).try_collect()?; let bytes: [u8; N] = decoded.try_into().map_err(|_| ContractError::HexFmtErr)?; Ok(bytes) } diff --git a/src/sdk/src/lib.rs b/src/sdk/src/lib.rs index e488316c8..d153d9ebe 100644 --- a/src/sdk/src/lib.rs +++ b/src/sdk/src/lib.rs @@ -48,6 +48,9 @@ pub mod crypto; pub mod tx; pub use tx::ContractCall; +/// Convenience utilities +pub mod util; + #[macro_use] /// WASM API functions pub mod wasm; diff --git a/src/sdk/src/util.rs b/src/sdk/src/util.rs new file mode 100644 index 000000000..d6875d857 --- /dev/null +++ b/src/sdk/src/util.rs @@ -0,0 +1,52 @@ +/* This file is part of DarkFi (https://dark.fi) + * + * Copyright (C) 2020-2024 Dyne.org foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/// Extra methods for Iterator. Copied from [itertools](https://github.com/rust-itertools/itertools). +/// +/// Licensed under MIT. +pub trait Itertools: Iterator { + /// `.try_collect()` is more convenient way of writing + /// `.collect::>()` + /// + /// # Example + /// + /// ``` + /// use std::{fs, io}; + /// use itertools::Itertools; + /// + /// fn process_dir_entries(entries: &[fs::DirEntry]) { + /// // ... + /// } + /// + /// fn do_stuff() -> std::io::Result<()> { + /// let entries: Vec<_> = fs::read_dir(".")?.try_collect()?; + /// process_dir_entries(&entries); + /// + /// Ok(()) + /// } + /// ``` + fn try_collect(self) -> Result + where + Self: Sized + Iterator>, + Result: FromIterator>, + { + self.collect() + } +} + +impl Itertools for T where T: Iterator + ?Sized {}