Skip to content

Instantly share code, notes, and snippets.

@milancermak
Created August 13, 2024 13:01
Show Gist options
  • Save milancermak/97f19c395571e21eea17c73b75819378 to your computer and use it in GitHub Desktop.
Save milancermak/97f19c395571e21eea17c73b75819378 to your computer and use it in GitHub Desktop.
first attempt at a Cairo macro
fn r() -> u128 {
let a = wad!(1.23);
a
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert!(super::r() == 1230000000000000000);
assert!(wad!(2.56) == 2560000000000000000);
assert!(wad!(3.14) == wad!(3.14));
}
}
use cairo_lang_macro::{inline_macro, ProcMacroResult, TokenStream};
use cairo_lang_parser::utils::SimpleParserDatabase;
use cairo_lang_syntax::node::kind::SyntaxKind::Arg;
use num_traits::cast::ToPrimitive;
#[inline_macro]
pub fn wad(token_stream: TokenStream) -> ProcMacroResult {
let db = SimpleParserDatabase::default();
let (parsed, _diag) = db.parse_virtual_with_diagnostics(token_stream);
let wad = parsed.descendants(&db).find_map(|node| {
if let Arg = node.kind(&db) {
Some(node.get_text(&db).to_string())
} else {
None
}
});
let wad: f64 = wad.unwrap().parse::<f64>().unwrap() * 1e18;
let wad: i64 = wad.to_i64().unwrap();
let ts = TokenStream::new((wad).to_string());
ProcMacroResult::new(ts)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment