mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
sdk/util.rs: add Itertools trait with .try_collect() method
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
52
src/sdk/src/util.rs
Normal 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 {}
|
||||
Reference in New Issue
Block a user