openvm_macros_common/
lib.rs
1use syn::{
2 parse::{Parse, ParseStream},
3 punctuated::Punctuated,
4 Expr, Ident, Token,
5};
6
7pub struct MacroArgs {
8 pub items: Vec<Item>,
9}
10
11pub struct Item {
12 pub name: Ident,
13 pub params: Punctuated<Param, Token![,]>,
14}
15
16pub struct Param {
17 pub name: Ident,
18 pub eq_token: Token![=],
19 pub value: Expr,
20}
21
22impl Parse for MacroArgs {
23 fn parse(input: ParseStream) -> syn::Result<Self> {
24 Ok(MacroArgs {
25 items: input
26 .parse_terminated(Item::parse, Token![,])?
27 .into_iter()
28 .collect(),
29 })
30 }
31}
32
33impl Parse for Item {
34 fn parse(input: ParseStream) -> syn::Result<Self> {
35 let name = input.parse()?;
36 let content;
37 syn::braced!(content in input);
38 let params = content.parse_terminated(Param::parse, Token![,])?;
39 Ok(Item { name, params })
40 }
41}
42
43impl Parse for Param {
44 fn parse(input: ParseStream) -> syn::Result<Self> {
45 let name: Ident = input.parse()?;
46 let eq_token: Token![=] = input.parse()?;
47 let value: Expr = input.parse()?;
48 Ok(Param {
49 name,
50 eq_token,
51 value,
52 })
53 }
54}
55
56pub fn string_to_bytes(s: &str) -> Vec<u8> {
57 if s.starts_with("0x") {
58 return s
59 .chars()
60 .skip(2)
61 .filter(|c| !c.is_whitespace())
62 .collect::<Vec<_>>()
63 .into_iter()
64 .rev()
65 .collect::<Vec<_>>()
66 .chunks(2)
67 .map(|ch| u8::from_str_radix(&ch.iter().rev().collect::<String>(), 16).unwrap())
68 .collect();
69 }
70 let mut digits = s
71 .chars()
72 .map(|c| c.to_digit(10).expect("Invalid numeric literal"))
73 .collect::<Vec<_>>();
74 let mut bytes = Vec::new();
75 while !digits.is_empty() {
76 let mut rem = 0u32;
77 let mut new_digits = Vec::new();
78 for &d in digits.iter() {
79 rem = rem * 10 + d;
80 new_digits.push(rem / 256);
81 rem %= 256;
82 }
83 digits = new_digits.into_iter().skip_while(|&d| d == 0).collect();
84 bytes.push(rem as u8);
85 }
86 bytes
87}