https://github.com/neo-ciber94/mattro-rs
A proc_macro attribute parser for Rust
https://github.com/neo-ciber94/mattro-rs
Last synced: 2 months ago
JSON representation
A proc_macro attribute parser for Rust
- Host: GitHub
- URL: https://github.com/neo-ciber94/mattro-rs
- Owner: Neo-Ciber94
- License: mit
- Created: 2021-07-18T19:51:46.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2021-07-24T01:40:31.000Z (about 4 years ago)
- Last Synced: 2025-01-06T17:47:02.500Z (9 months ago)
- Language: Rust
- Size: 35.2 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# mattro-rs
`mattro` is a **proc_macro** attribute parser for Rust.
## Usage
Add this to your Cargo.toml:
```
[dependencies]
mattro = "0.1.1"
```You can parse:
- `Attribute` using `MacroAttribute::new(attribute)`
- `AttributeArgs` using `MacroAttribute::from_attribute_args(path, args, style)`## Example
Parsing `AttributeArgs`:`main.rs`
```rust
#[my_attribute(text="some text", number=120, array=1,2,3)]
fn main() {}
````lib.rs`
```rust
use mattro::MacroAttribute;
use proc_macro::TokenStream;#[proc_macro_attribute]
pub fn my_attribute(attribute: TokenStream, item: TokenStream) -> TokenStream {
let tokens = attribute.clone();
let attribute_args: syn::AttributeArgs = syn::parse_macro_input!(tokens);// Creates a `MacroAttribute` from `AttributeArgs`.
let attr = MacroAttribute::from_attribute_args(
// Path of the attribute
"my_attribute",// The `AttributeArgs`
attribute_args,// The attribute style `inner` or `outer`
syn::AttrStyle::Outer
);// Prints all the `MetaItem`s
for meta_item in &attr {
println!("{:#?}", meta_item);
}// Returns the decorated item
item
}
```This prints out:
```scala
NameValue(
NameValue {
name: "text",
value: Literal(
Str(
LitStr {
token: "some text",
},
),
),
},
)
NameValue(
NameValue {
name: "number",
value: Literal(
Int(
LitInt {
token: 120,
},
),
),
},
)
NameValue(
NameValue {
name: "array",
value: Array(
[
Int(
LitInt {
token: 1,
},
),
Int(
LitInt {
token: 2,
},
),
Int(
LitInt {
token: 3,
},
),
],
),
},
)
```### You could convert the attribute into a `name-value` pairs
```rust
// Converts the attribute into a `name-value` attribute
let name_values_attributes = attr.into_name_values().unwrap();// Iterate over the `name-value` pairs
for (name, value) in &name_values_attributes {
println!("{:7} => {}", name, value);
}
```This prints out:
```js
text => "some text"
number => 120
array => [1, 2, 3]
```