use std::path::PathBuf;
use proc_macro::TokenStream;
use syn::ExprLit;
use token::CustomPath;
mod path;
mod token;
#[proc_macro]
pub fn repo_path(input: TokenStream) -> TokenStream {
let relative =
if input.is_empty() {
None
} else {
Some(syn::parse_macro_input!(input as ExprLit))
};
let repo_dir = repo_path_lib::repo_dir();
let result = parse_relative_path(repo_dir, relative.as_ref());
token::output_result_as_tokenstream(result)
}
#[proc_macro]
pub fn custom_base_path(input: TokenStream) -> TokenStream {
let CustomPath { base_path, relative_path } = syn::parse_macro_input!(input as CustomPath);
let result = token::parse_path_from_expr_lit(&base_path)
.and_then(|(base_path, _)| parse_relative_path(base_path, relative_path.as_ref()));
token::output_result_as_tokenstream(result)
}
fn parse_relative_path(base_path: PathBuf, relative_path: Option<&ExprLit>) -> Result<PathBuf, syn::Error> {
let relative_path = relative_path
.map(token::parse_path_from_expr_lit)
.transpose()?;
let repo_dir = repo_path_lib::repo_dir();
let path = path::construct_and_validate_path(&base_path, &repo_dir, relative_path)?;
Ok(path)
}