♻️ Major code restructuring
This commit is contained in:
parent
a96e203bb3
commit
fa66d628a0
221 changed files with 228 additions and 315 deletions
113
src/util.rs
Normal file
113
src/util.rs
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
//! Functions and macro helpers.
|
||||
|
||||
use crate::{trace, Handle};
|
||||
|
||||
use std::io;
|
||||
use std::path::PathBuf;
|
||||
|
||||
// *************************************************************************************************
|
||||
// FUNCTIONS HELPERS.
|
||||
// *************************************************************************************************
|
||||
|
||||
// https://stackoverflow.com/a/71464396
|
||||
#[doc(hidden)]
|
||||
pub const fn handle(
|
||||
module_path: &'static str,
|
||||
file: &'static str,
|
||||
line: u32,
|
||||
column: u32,
|
||||
) -> Handle {
|
||||
let mut hash = 0xcbf29ce484222325;
|
||||
let prime = 0x00000100000001B3;
|
||||
|
||||
let mut bytes = module_path.as_bytes();
|
||||
let mut i = 0;
|
||||
|
||||
while i < bytes.len() {
|
||||
hash ^= bytes[i] as u64;
|
||||
hash = hash.wrapping_mul(prime);
|
||||
i += 1;
|
||||
}
|
||||
|
||||
bytes = file.as_bytes();
|
||||
i = 0;
|
||||
while i < bytes.len() {
|
||||
hash ^= bytes[i] as u64;
|
||||
hash = hash.wrapping_mul(prime);
|
||||
i += 1;
|
||||
}
|
||||
|
||||
hash ^= line as u64;
|
||||
hash = hash.wrapping_mul(prime);
|
||||
hash ^= column as u64;
|
||||
hash = hash.wrapping_mul(prime);
|
||||
hash
|
||||
}
|
||||
|
||||
pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str {
|
||||
if last == 0 {
|
||||
return type_name;
|
||||
}
|
||||
let positions: Vec<_> = type_name.rmatch_indices("::").collect();
|
||||
if positions.len() < last {
|
||||
return type_name;
|
||||
}
|
||||
&type_name[(positions[last - 1].0 + 2)..]
|
||||
}
|
||||
|
||||
pub fn single_type_name<T: ?Sized>() -> &'static str {
|
||||
partial_type_name(std::any::type_name::<T>(), 1)
|
||||
}
|
||||
|
||||
pub fn absolute_dir(
|
||||
root_path: impl Into<String>,
|
||||
relative_path: impl Into<String>,
|
||||
) -> Result<String, io::Error> {
|
||||
let root_path = PathBuf::from(root_path.into());
|
||||
let full_path = root_path.join(relative_path.into());
|
||||
let absolute_dir = full_path.to_string_lossy().into();
|
||||
|
||||
if !full_path.is_absolute() {
|
||||
let message = format!("Path \"{}\" is not absolute", absolute_dir);
|
||||
trace::warn!(message);
|
||||
return Err(io::Error::new(io::ErrorKind::InvalidInput, message));
|
||||
}
|
||||
|
||||
if !full_path.exists() {
|
||||
let message = format!("Path \"{}\" does not exist", absolute_dir);
|
||||
trace::warn!(message);
|
||||
return Err(io::Error::new(io::ErrorKind::NotFound, message));
|
||||
}
|
||||
|
||||
if !full_path.is_dir() {
|
||||
let message = format!("Path \"{}\" is not a directory", absolute_dir);
|
||||
trace::warn!(message);
|
||||
return Err(io::Error::new(io::ErrorKind::InvalidInput, message));
|
||||
}
|
||||
|
||||
Ok(absolute_dir)
|
||||
}
|
||||
|
||||
// *************************************************************************************************
|
||||
// MACRO HELPERS.
|
||||
// *************************************************************************************************
|
||||
|
||||
#[macro_export]
|
||||
/// Macro para construir grupos de pares clave-valor.
|
||||
///
|
||||
/// ```rust#ignore
|
||||
/// let args = kv![
|
||||
/// "userName" => "Roberto",
|
||||
/// "photoCount" => 3,
|
||||
/// "userGender" => "male",
|
||||
/// ];
|
||||
/// ```
|
||||
macro_rules! kv {
|
||||
( $($key:expr => $value:expr),* $(,)? ) => {{
|
||||
let mut a = std::collections::HashMap::new();
|
||||
$(
|
||||
a.insert($key.into(), $value.into());
|
||||
)*
|
||||
a
|
||||
}};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue