Skip to content

⚙️ - Rust macro to convert Markdown Data Models into usable code

Notifications You must be signed in to change notification settings

FAIRChemistry/md-models-macro

Folders and files

NameName
Last commit message
Last commit date

Latest commit

6cf3059 · Jul 1, 2024

History

11 Commits
Jul 1, 2024
Jul 1, 2024
Jul 1, 2024
Jul 1, 2024
Jul 1, 2024
Jul 1, 2024
Jul 1, 2024

Repository files navigation

MD-Models Macro

Build Status

This macro can be used to convert a markdown model using MD-Models into Rust structs and enums. The resulting Rust code can be used to serialize and deserialize the model and integrate it into your Rust project.

Installation

cargo install mdmodels-macro

Example

Suppose you have a markdown file model.md with the following content:

# Test

### Object

- string_value
  - Type: string
- enum_value
  - Type: SomeEnum

### SomeEnum

```python
VALUE = value
ANOTHER = another
```

You can convert this markdown file into Rust code using the following command:

use mdmodels_macro::parse_mdmodel;

parse_mdmodel!("tests/data/model.md");

At this point, the macro will generate the corresponding structs and enums in Rust code, which will be available as a module. The module name is derived from the title (# Test) as snake case, if present. Otherwise the module name will be model.

You can then use the module in your code:

Non-builder pattern

fn main () {
    let obj = test::Object {
        string_value: "Hello, World!".to_string(),
        enum_value: model::SomeEnum::VALUE,
    };

    // Serialize the object
    let serialized = serde_json::to_string(&obj).unwrap();

    println!("Serialized: \n{}\n", serialized);

    // Deserialize the object
    let deserialized: test::Object = serde_json::from_str(&serialized).unwrap();

    println!("Deserialized: \n{:#?}\n", deserialized);
}

Builder pattern

This macro also supports the builder pattern. To use the builder pattern, you need to use the Builder struct of the object in the markdown file:

fn main () -> Result<(), Box<dyn std::error::Error>> {
    let obj = test::ObjectBuilder::new()
        .string_value("Hello, World!")
        .enum_value(model::SomeEnum::VALUE)
        .build()?;

    // Serialize the object
    let serialized = serde_json::to_string(&obj).unwrap();

    println!("Serialized: \n{}\n", serialized);

    // Deserialize the object
    let deserialized: test::Object = serde_json::from_str(&serialized).unwrap();

    println!("Deserialized: \n{:#?}\n", deserialized);

    Ok(())
}

About

⚙️ - Rust macro to convert Markdown Data Models into usable code

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages