Crate genco

source · []
Expand description

github crates.io docs.rs build status

A whitespace-aware quasiquoter for beautiful code generation.

Central to genco are the quote! and quote_in! procedural macros which ease the construction of token streams.

This project solves the following language-specific concerns:

  • Imports — Generates and groups import statements as they are used. So you only import what you use, with no redundancy. We also do our best to solve namespace conflicts.

  • String Quoting — genco knows how to quote strings. And can even interpolate values into the quoted string if it’s supported by the language.

  • Structural Indentation — The quoter relies on intuitive whitespace detection to structurally sort out spacings and indentation. Allowing genco to generate beautiful readable code with minimal effort. This is also a requirement for generating correctly behaving code in languages like Python where indentation is meaningful.

  • Language Customization — Building support for new languages is a piece of cake with the help of the impl_lang! macro.


To do whitespace detection, we depend on the nightly proc_macro_span feature and that the genco_nightly configuration flag is set. Otherwise genco falls back to simply inserting spaces between each detected token.

Until this is stabilized and you want whitespace detection you must build and run projects using genco with a nightly compiler.

RUSTFLAGS="--cfg genco_nightly" cargo +nightly run --example rust

Supported Languages

The following are languages which have built-in support in genco.

Is your favorite language missing? Open an issue!

You can run one of the examples by:

cargo +nightly run --example rust

Rust Example

The following is a simple program producing Rust code to stdout with custom configuration:

use genco::prelude::*;

let hash_map = rust::import("std::collections", "HashMap");

let tokens: rust::Tokens = quote! {
    fn main() {
        let mut m = #hash_map::new();
        m.insert(1u32, 2u32);
    }
};

println!("{}", tokens.to_file_string()?);

This would produce:

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert(1u32, 2u32);
}

Modules

Code formatting utilities.

Language specialization for genco

Prelude containing typical things to import when using the library.

Utilities for working with token streams.

Macros

Macro to implement support for a custom language.

Whitespace sensitive quasi-quoting.

Convenience macro for constructing a FormatInto implementation in-place.

Behaves the same as quote! while quoting into an existing token stream with <target> => <quoted>.

Structs

A stream of tokens.