#![doc(html_root_url = "https://docs.rs/fixed_len_str/0.3.3/")]
#![no_std]
extern crate proc_macro;
extern crate alloc;
use proc_macro::TokenStream;
use alloc::string::ToString;
use alloc::format;
#[proc_macro]
pub fn fixed_len_str(input: TokenStream) -> TokenStream {
let len = match input.to_string().trim().parse::<usize>() {
Ok(n) => n,
Err(e) => return format!("compile_error!(\"Error parsing the argument to an usize: {}\")", e).parse().unwrap(),
};
let half_len = {
let mut temp = len / 2;
if (len - (temp + temp)) != 0 {
temp += 1;
}
temp.to_string()
};
let len = len.to_string();
let mut string = include_str!("code.in").to_string();
if cfg!(feature = "serde_support") {
string.push_str(include_str!("serde_code.in"))
}
if cfg!(feature = "pattern_pred_support") {
string.push_str(include_str!("pattern_pred_code.in"))
}
string.push_str("
}
$doc_hide
pub use fixed_str$len::FixedStr$len;");
if cfg!(feature = "docs_hidden") {
string = string.replace("$doc_hide", "#[doc(hidden)]");
} else {
string = string.replace("$doc_hide", "");
}
string.replace("$len", &len[..]).replace("$half_len_rounded_up", &half_len[..]).parse().unwrap()
}
#[proc_macro]
pub fn fixed_len_str_nz(input: TokenStream) -> TokenStream {
let mut string = include_str!("code_nz.in").to_string();
if cfg!(feature = "serde_support") {
string.push_str(include_str!("serde_code_nz.in"))
}
if cfg!(feature = "pattern_pred_support") {
string.push_str(include_str!("pattern_pred_code_nz.in"))
}
string.push_str("
}
$doc_hide
pub use fixed_str_nz$len::FixedStrNZ$len;");
if cfg!(feature = "docs_hidden") {
string = string.replace("$doc_hide", "#[doc(hidden)]");
} else {
string = string.replace("$doc_hide", "");
}
string.replace("$len", input.to_string().trim()).parse().unwrap()
}
#[proc_macro_attribute]
pub fn use_fixed_str(_: TokenStream, input: TokenStream) -> TokenStream {
let mut input = input.to_string();
let input2 = input.clone();
let mut searched = &input2[..];
while let Some(i) = searched.find("FixedStr") {
searched = &searched[i..];
if searched.starts_with("FixedStrNZ") {
searched = &searched[7..];
continue;
}
if let Some(i2) = searched.find(|c: char| c.is_numeric()) {
searched = &searched[i2..];
let s = format!("fixed_len_str::fixed_len_str!({});", &searched[..searched.find(|c: char| !c.is_numeric())
.expect("Number has no end")]);
if !input.contains(&s[..]) {
input.push_str(&s[..]);
}
}
}
input.parse().unwrap()
}
#[proc_macro_attribute]
pub fn use_fixed_str_nz(_: TokenStream, input: TokenStream) -> TokenStream {
let mut input = input.to_string();
let input2 = input.clone();
let mut searched = &input2[..];
while let Some(i) = searched.find("FixedStrNZ") {
searched = &searched[i..];
if let Some(i2) = searched.find(|c: char| c.is_numeric()) {
searched = &searched[i2..];
let s = format!("fixed_len_str::fixed_len_str_nz!({});", &searched[..searched.find(|c: char| !c.is_numeric())
.expect("Number has no end")]);
if !input.contains(&s[..]) {
input.push_str(&s[..]);
}
}
}
input.parse().unwrap()
}