Macro zalgo_codec_macro::zalgo_embed
source · zalgo_embed!() { /* proc-macro */ }
Expand description
This macro decodes a Unicode string that has been encoded with zalgo_encode
and passes the results on to the compiler.
Examples
We can use a function created in encoded source code:
// This line expands to the code
// `fn add(x: i32, y: i32) -> i32 {x + y}`
zalgo_embed!("E͎͉͙͉̞͉͙͆̀́̈́̈́̈̀̓̒̌̀̀̓̒̉̀̍̀̓̒̀͛̀̋̀͘̚̚͘͝");
// Now the `add` function is available
assert_eq!(add(10, 20), 30);
It works on expressions too!
let x = 20;
let y = -10;
// This macro is expanded to the code
// `x + y`
let z = zalgo_embed!("È͙̋̀͘");
assert_eq!(z, x + y);
A more complex example is this program which expands to code that reads the command line input, encodes it, and prints out the result.
use zalgo_codec_common::{zalgo_encode, UnencodableCharacterError};
use zalgo_codec_macro::zalgo_embed;
fn main() -> Result<(), UnencodableCharacterError> {
// This macro expands to
// let input = std::env::args().collect::<Vec<_>>()[1..].join(" ");
// let output = zalgo_encode(&input)?;
// println!("{}", output);
zalgo_embed!("E͔͉͎͕͔̝͓͔͎͖͇͓͌̀͐̀̀̈́́͒̈̉̎̓̚̚̚̚ͅͅ͏̶͔̜̜̞̞̻͌͌̓̓̿̈̉̑̎̎̽̎͊̚̚ͅͅ͏̛͉͎͔̈̂̀̂̉ͯ͌̀ͅ͏͕͔͕͔̝͚͇͐̀̀́͌͏͎̿̓ͅ͏̛͉͎͕͔̟͉͎͔͎̼͎̼͎̈́̈̆͐̉ͯ͐͒͌́̈̂͛̂̌̀͝ͅ͏̛͕͔͕͔͐̉");
Ok(())
}
Limitations
This is an incomplete list of the limitations of this macro. There are many more, and as I learn about them I will add them here. Feel free to create a Pull Request on Github for adding more notes here if you know of more limitations.
- Due to ambiguity macros can not deal with variable names inside format string literals. An example of this is that
println!("{variable_name}")
will give a compile error if used in a macro, but
println!("{}", variable_name)
will work fine. This means that callingzalgo_embed!
on the encoded version of the former will not work.