#include #hello-world #default #build #extra #registry #expansion

archived syntex

A library that enables compile time syntax extension expansion

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

#10 in #syntex

Download history 2326/week @ 2023-10-29 2624/week @ 2023-11-05 2722/week @ 2023-11-12 2585/week @ 2023-11-19 2337/week @ 2023-11-26 1904/week @ 2023-12-03 2152/week @ 2023-12-10 2567/week @ 2023-12-17 2115/week @ 2023-12-24 1628/week @ 2023-12-31 2316/week @ 2024-01-07 2122/week @ 2024-01-14 2100/week @ 2024-01-21 2157/week @ 2024-01-28 2164/week @ 2024-02-04 2099/week @ 2024-02-11

8,752 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 = [ "erick.tryzelaar@gmail.com" ]

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

To use it:

Cargo.toml:

[package]
name = "hello_world"
version = "0.3.0"
authors = [ "erick.tryzelaar@gmail.com" ]
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