diff --git a/.gitignore b/.gitignore index cc563fb6..0fda6e1c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ target *.bk .idea +.vscode \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c9054e5e..a0f4c1ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,9 +90,9 @@ dependencies = [ [[package]] name = "ego-tree" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a1c26db6cdc3076a84e511b708f85d5c7167a8c65c25fc2279a6315d34777c" +checksum = "7c6ba7d4eec39eaa9ab24d44a0e73a7949a1095a8b3f3abb11eddf27dbb56a53" [[package]] name = "equivalent" @@ -434,6 +434,16 @@ dependencies = [ "tendril", ] +[[package]] +name = "scraper_proc_macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "scraper", + "syn", +] + [[package]] name = "selectors" version = "0.25.0" diff --git a/Cargo.toml b/Cargo.toml index cbece98a..f6b9bc2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,8 @@ [workspace] resolver = "2" -members = ["scraper"] +members = ["scraper", "scraper_proc_macros"] + +[workspace.dependencies] +scraper = { path = "./scraper" } +scraper_proc_macros = { path = "./scraper_proc_macros" } \ No newline at end of file diff --git a/scraper/Cargo.toml b/scraper/Cargo.toml index 6d1b5414..b496d526 100644 --- a/scraper/Cargo.toml +++ b/scraper/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" [dependencies] cssparser = "0.31.0" -ego-tree = "0.8.0" +ego-tree = "0.9.0" html5ever = "0.27" selectors = "0.25.0" tendril = "0.4.3" diff --git a/scraper_proc_macros/Cargo.toml b/scraper_proc_macros/Cargo.toml new file mode 100644 index 00000000..aeac45ce --- /dev/null +++ b/scraper_proc_macros/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "scraper_proc_macros" +version = "0.1.0" +edition = "2021" + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = "1.0.86" +quote = "1.0.37" +scraper = { workspace = true } +syn = "2.0.76" diff --git a/scraper_proc_macros/src/lib.rs b/scraper_proc_macros/src/lib.rs new file mode 100644 index 00000000..43b0ebd2 --- /dev/null +++ b/scraper_proc_macros/src/lib.rs @@ -0,0 +1,21 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, LitStr}; + +#[proc_macro] +pub fn selector(input: TokenStream) -> TokenStream { + let selector = parse_macro_input!(input as LitStr); + + match scraper::Selector::parse(&selector.value()) { + Ok(_) => quote!( + ::scraper::Selector::parse(#selector).unwrap() + ) + .into(), + Err(e) => syn::Error::new( + proc_macro2::Span::call_site(), + format!("Failed to parse CSS selector: {}", e), + ) + .to_compile_error() + .into(), + } +}