Просмотр исходного кода

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

zero 2 лет назад
Родитель
Сommit
1cdbd03673
4 измененных файлов с 58 добавлено и 6 удалено
  1. 1 4
      src/sdk/src/crypto/util.rs
  2. 2 2
      src/sdk/src/hex.rs
  3. 3 0
      src/sdk/src/lib.rs
  4. 52 0
      src/sdk/src/util.rs

+ 1 - 4
src/sdk/src/crypto/util.rs

@@ -107,10 +107,7 @@ pub trait FieldElemAsStr: PrimeField<Repr = [u8; 32]> {
         let mut bytes = decode_hex_arr(hex)?;
         let mut bytes = decode_hex_arr(hex)?;
         bytes.reverse();
         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)
     }
     }
 }
 }
 
 

+ 2 - 2
src/sdk/src/hex.rs

@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * 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
 /// Creates a hex formatted string of the data
 #[inline]
 #[inline]
@@ -66,7 +66,7 @@ impl<'a> Iterator for HexDecodeIter<'a> {
 }
 }
 
 
 pub fn decode_hex_arr<const N: usize>(hex: &str) -> GenericResult<[u8; N]> {
 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)?;
     let bytes: [u8; N] = decoded.try_into().map_err(|_| ContractError::HexFmtErr)?;
     Ok(bytes)
     Ok(bytes)
 }
 }

+ 3 - 0
src/sdk/src/lib.rs

@@ -48,6 +48,9 @@ pub mod crypto;
 pub mod tx;
 pub mod tx;
 pub use tx::ContractCall;
 pub use tx::ContractCall;
 
 
+/// Convenience utilities
+pub mod util;
+
 #[macro_use]
 #[macro_use]
 /// WASM API functions
 /// WASM API functions
 pub mod wasm;
 pub mod wasm;

+ 52 - 0
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 <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 {}