I use include_str!()
to import the str from a file, and i want to pass it into a proc_marco,bug it do not work.I got error expected string literal
from rustc.
Here are my codes:
<code>macro_rules! ptcl_layer {
() => {
include_str!("tcp_to_msg.layer")
};
}
pub static TEMPLETE: &'static str = ptcl_layer!();
pub static TEMPLETE_HEADER: &'static str = get_protocol_layer_header!(ptcl_layer!());
pub static TEMPLETE_END: &'static str = get_protocol_layer_end!(ptcl_layer!());
#[proc_macro]
pub fn get_protocol_layer_header(_s: TokenStream) -> TokenStream {
let total_str = parse_macro_input!(_s as LitStr).value();
let header = total_str.lines().next().unwrap();
let header = header
.replace("${.LEN}n", "");
let output = quote::quote! {
#header
};
TokenStream::from(output)
}
#[proc_macro]
pub fn get_protocol_layer_end(_s: TokenStream) -> TokenStream {
let input = parse_macro_input!(_s as LitStr);
let input = input.value();
let last_line = input.lines().last().unwrap_or("");
let output = quote::quote! {
#last_line
};
TokenStream::from(output)
}
</code>
<code>macro_rules! ptcl_layer {
() => {
include_str!("tcp_to_msg.layer")
};
}
pub static TEMPLETE: &'static str = ptcl_layer!();
pub static TEMPLETE_HEADER: &'static str = get_protocol_layer_header!(ptcl_layer!());
pub static TEMPLETE_END: &'static str = get_protocol_layer_end!(ptcl_layer!());
#[proc_macro]
pub fn get_protocol_layer_header(_s: TokenStream) -> TokenStream {
let total_str = parse_macro_input!(_s as LitStr).value();
let header = total_str.lines().next().unwrap();
let header = header
.replace("${.LEN}n", "");
let output = quote::quote! {
#header
};
TokenStream::from(output)
}
#[proc_macro]
pub fn get_protocol_layer_end(_s: TokenStream) -> TokenStream {
let input = parse_macro_input!(_s as LitStr);
let input = input.value();
let last_line = input.lines().last().unwrap_or("");
let output = quote::quote! {
#last_line
};
TokenStream::from(output)
}
</code>
macro_rules! ptcl_layer {
() => {
include_str!("tcp_to_msg.layer")
};
}
pub static TEMPLETE: &'static str = ptcl_layer!();
pub static TEMPLETE_HEADER: &'static str = get_protocol_layer_header!(ptcl_layer!());
pub static TEMPLETE_END: &'static str = get_protocol_layer_end!(ptcl_layer!());
#[proc_macro]
pub fn get_protocol_layer_header(_s: TokenStream) -> TokenStream {
let total_str = parse_macro_input!(_s as LitStr).value();
let header = total_str.lines().next().unwrap();
let header = header
.replace("${.LEN}n", "");
let output = quote::quote! {
#header
};
TokenStream::from(output)
}
#[proc_macro]
pub fn get_protocol_layer_end(_s: TokenStream) -> TokenStream {
let input = parse_macro_input!(_s as LitStr);
let input = input.value();
let last_line = input.lines().last().unwrap_or("");
let output = quote::quote! {
#last_line
};
TokenStream::from(output)
}
The full error msg:
<code>error: expected string literal
--> src/controller/mod.rs:16:71
|
16 | pub static TEMPLETE_HEADER: &'static str = get_protocol_layer_header!(ptcl_layer!());
| ^^^^^^^^^^
</code>
<code>error: expected string literal
--> src/controller/mod.rs:16:71
|
16 | pub static TEMPLETE_HEADER: &'static str = get_protocol_layer_header!(ptcl_layer!());
| ^^^^^^^^^^
</code>
error: expected string literal
--> src/controller/mod.rs:16:71
|
16 | pub static TEMPLETE_HEADER: &'static str = get_protocol_layer_header!(ptcl_layer!());
| ^^^^^^^^^^
And the *.layer like:
<code><? lines: ${.LEN}
${.CONTENT}
<? end
</code>
<code><? lines: ${.LEN}
${.CONTENT}
<? end
</code>
<? lines: ${.LEN}
${.CONTENT}
<? end
I also tried another version of the code:
<code>#[proc_macro]
pub fn get_protocol_layer_header(_s: TokenStream) -> TokenStream {
let total_str = _s.to_string();
let header = total_str.lines().next().unwrap();
let header = header
.replace("${.LEN}n", "");
header.parse().unwrap()
}
#[proc_macro]
pub fn get_protocol_layer_end(_s: TokenStream) -> TokenStream {
let total_str = _s.to_string();
let last_line = total_str.lines().last().unwrap_or("");
last_line.parse().unwrap()
}
</code>
<code>#[proc_macro]
pub fn get_protocol_layer_header(_s: TokenStream) -> TokenStream {
let total_str = _s.to_string();
let header = total_str.lines().next().unwrap();
let header = header
.replace("${.LEN}n", "");
header.parse().unwrap()
}
#[proc_macro]
pub fn get_protocol_layer_end(_s: TokenStream) -> TokenStream {
let total_str = _s.to_string();
let last_line = total_str.lines().last().unwrap_or("");
last_line.parse().unwrap()
}
</code>
#[proc_macro]
pub fn get_protocol_layer_header(_s: TokenStream) -> TokenStream {
let total_str = _s.to_string();
let header = total_str.lines().next().unwrap();
let header = header
.replace("${.LEN}n", "");
header.parse().unwrap()
}
#[proc_macro]
pub fn get_protocol_layer_end(_s: TokenStream) -> TokenStream {
let total_str = _s.to_string();
let last_line = total_str.lines().last().unwrap_or("");
last_line.parse().unwrap()
}
But it returned the original text without any processing.