use std::path::PathBuf;
use syn::{spanned::Spanned, Expr, ExprPath};
pub fn parse_input_paths(args: Expr) -> Vec<ExprPath> {
match args {
Expr::Path(path) => {
vec![path]
}
Expr::Array(array) => {
let mut paths = vec![];
for expr in array.elems {
match expr {
Expr::Path(path) => paths.push(path),
_ => {
err!(expr, "Only paths are allowed in struct_merge's attribute.");
}
}
}
paths
}
_ => {
err!(
args,
"struct_merge's macro parameters should be either a single path {} ",
"or a vector of paths, such as '[crate::your::path]'."
);
vec![]
}
}
}
pub fn get_root_src_path(parsed_args: &Expr) -> Option<PathBuf> {
match std::env::var("CARGO_MANIFEST_DIR") {
Err(error) => {
err!(
parsed_args,
"Couldn't read CARGO_MANIFEST_DIR environment variable: {}",
error
);
None
}
Ok(path) => {
let mut path = PathBuf::from(path);
if !path.exists() {
err!(
parsed_args,
"CARGO_MANIFEST_DIR path doesn't exist: {:?}",
path
);
return None;
}
path.push("src");
Some(path)
}
}
}