Thanks to visit codestin.com
Credit goes to lib.rs

44 breaking releases

Uses old Rust 2015

0.58.1 Feb 19, 2017
0.57.0 Jan 25, 2017
0.52.0 Nov 26, 2016
0.39.0 Jul 26, 2016
0.0.0 Dec 5, 2014

#22 in #expansion

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

8,703 downloads per month
This crate has lost popularity

MIT/Apache

16KB
362 lines

Syntex Code Generation Framework

Build Status Latest Version

syntex is a library that enables compile time syntax extension expansion. This allows users to use libraries like serde on stable Rust.

Configuring with Cargo

To create a package:

[package]
name = "hello_world_macros"
version = "0.2.0"
authors = [ "[email protected]" ]

[dependencies]
syntex = "*"
syntex_syntax = "*"

To use it:

Cargo.toml:

[package]
name = "hello_world"
version = "0.3.0"
authors = [ "[email protected]" ]
build = "build.rs"

[build-dependencies]
syntex = "*"

build.rs:

extern crate syntex;
extern crate hello_world_macros;

use std::env;
use std::path::Path;

fn main() {
    let mut registry = syntex::Registry::new();
    hello_world_macros::register(&mut registry);

    let src = Path::new("src/main.rs.in");
    let dst = Path::new(&env::var("OUT_DIR").unwrap()).join("main.rs");

    registry.expand("hello_world", &src, &dst).unwrap();
}

src/main.rs:

// Include the real main
include!(concat!(env!("OUT_DIR"), "/main.rs"));

src/main.rs.in:

fn main() {
    let s = hello_world!();
    println!("{}", s);
}

Limitations

Unfortunately because there is no stable plugin support in Rust yet, there are some things that syntex cannot do:

  • The code generated by syntex reports errors in the generated file, not the source file.
  • Syntex macros cannot be embedded in macros it doesn't know about, like the builtin vec![], println!(...), and etc. This is because those macros may override the macro_name!(...) to mean something different.

Dependencies