sdk/util.rs: add Itertools trait with .try_collect() method

This commit is contained in:
zero
2024-04-03 11:08:04 +02:00
parent d3404939aa
commit 1cdbd03673
4 changed files with 58 additions and 6 deletions

View File

@@ -107,10 +107,7 @@ pub trait FieldElemAsStr: PrimeField<Repr = [u8; 32]> {
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)
}
}

View File

@@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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<const N: usize>(hex: &str) -> GenericResult<[u8; N]> {
let decoded = decode_hex(hex).collect::<GenericResult<Vec<_>>>()?;
let decoded: Vec<_> = decode_hex(hex).try_collect()?;
let bytes: [u8; N] = decoded.try_into().map_err(|_| ContractError::HexFmtErr)?;
Ok(bytes)
}

View File

@@ -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;

52
src/sdk/src/util.rs Normal file
View File

@@ -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 <https://www.gnu.org/licenses/>.
*/
/// 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::<Result<_, _>>()`
///
/// # 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<T, U, E>(self) -> Result<U, E>
where
Self: Sized + Iterator<Item = Result<T, E>>,
Result<U, E>: FromIterator<Result<T, E>>,
{
self.collect()
}
}
impl<T> Itertools for T where T: Iterator + ?Sized {}