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}