util.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use std::{fs::File, io::BufReader, path::Path};
  2. use rand::{distributions::Alphanumeric, thread_rng, Rng};
  3. use serde::{de::DeserializeOwned, Serialize};
  4. use darkfi::Result;
  5. pub fn random_ref_id() -> String {
  6. thread_rng().sample_iter(&Alphanumeric).take(30).map(char::from).collect()
  7. }
  8. pub fn find_free_id(task_ids: &[u32]) -> u32 {
  9. for i in 1.. {
  10. if !task_ids.contains(&i) {
  11. return i
  12. }
  13. }
  14. 1
  15. }
  16. pub fn load<T: DeserializeOwned>(path: &Path) -> Result<T> {
  17. let file = File::open(path)?;
  18. let reader = BufReader::new(file);
  19. let value: T = serde_json::from_reader(reader)?;
  20. Ok(value)
  21. }
  22. pub fn save<T: Serialize>(path: &Path, value: &T) -> Result<()> {
  23. let file = File::create(path)?;
  24. serde_json::to_writer_pretty(file, value)?;
  25. Ok(())
  26. }
  27. #[cfg(test)]
  28. mod tests {
  29. use super::*;
  30. #[test]
  31. fn find_free_id_test() -> Result<()> {
  32. let mut ids: Vec<u32> = vec![1, 3, 8, 9, 10, 3];
  33. let ids_empty: Vec<u32> = vec![];
  34. let ids_duplicate: Vec<u32> = vec![1; 100];
  35. let find_id = find_free_id(&ids);
  36. assert_eq!(find_id, 2);
  37. ids.push(find_id);
  38. assert_eq!(find_free_id(&ids), 4);
  39. assert_eq!(find_free_id(&ids_empty), 1);
  40. assert_eq!(find_free_id(&ids_duplicate), 2);
  41. Ok(())
  42. }
  43. }