use syn::{spanned::Spanned, Error, Ident, Path, Result};
pub fn path_compare_str(path: &Path, string: &[&str]) -> bool {
path.segments.len() == string.len()
&& path
.segments
.iter()
.zip(string)
.filter(|&(segment, string)| segment.ident.to_string().as_str() != *string)
.count()
== 0
}
pub fn path_to_single_ident(path: &Path) -> Result<Ident> {
if path.segments.len() == 1 {
Ok(path.segments[0].ident.clone())
} else {
Err(Error::new(
path.span(),
"Expected only one segment in the Path",
))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::tests::tokens_to_syn;
use quote::quote;
#[test]
fn test_path_compare_str() {
let path: Path = tokens_to_syn(quote! { a::b::c });
assert!(!path_compare_str(&path, &["a", "b"]));
assert!(path_compare_str(&path, &["a", "b", "c"]));
assert!(!path_compare_str(&path, &["a", "c", "b"]));
assert!(!path_compare_str(&path, &["a", "b", "c", "d"]));
}
#[test]
fn test_path_to_single_ident() {
let path: Path = tokens_to_syn(quote! { a::b::c });
assert!(path_to_single_ident(&path).is_err());
let path: Path = tokens_to_syn(quote! { a });
let ident = path_to_single_ident(&path).unwrap();
assert_eq!(ident, "a");
}
}