#struct #intermediate #macro #bake #ignore #url

面包师

用于创建中间结构的派生宏

4个版本

0.2.0 2022年10月30日
0.1.2 2022年5月20日
0.1.1 2022年5月20日
0.1.0 2022年5月20日

4#bake

每月29 次下载
用于 rotz

MIT 许可证

17KB
421

面包师

crates.io docs.rs

面包师提供了一个过程宏,用于从中间结构创建最终(烘焙)结构。

假设你有一个从参数或配置文件解析的结构体,你需要在这之前处理这些数据到相似的结构体。

struct Cli {
  pub urls: Vec<String>,
  pub add_slash_to_end: bool
}

struct CliBaked {
  pub urls: Vec<String>,
}

impl Cli {
  pub fn bake(self) -> CliBaked {
    CliBaked {
      urls: self.urls.into_iter().map(|u| if self.add_slash_to_end && !u.ends_with('/') { u + "/" } else { u }).collect::<Vec<_>>()
    }
  }
}

使用面包师可以实现同样的效果。

use baker::Bake;

#[derive(Bake)]
#[baked(name = "CliBaked")]
struct Cli {
  #[baked(map_fn(bake = "|cli| cli.urls.iter().map(|u| if cli.add_slash_to_end && !u.ends_with('/') { u.to_string() + \"/\" } else { u.to_string() }).collect::<Vec<_>>()"))]
  pub urls: Vec<String>,
  #[baked(ignore)]
  pub add_slash_to_end: bool,
}

依赖

~2MB
~43K SLoC