1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
//! Utilities for working with token streams.
//!
//! This is typically a module you will use if you intend to provide a manual
//! implementation of [FormatInto].
//!
//! # Examples
//!
//! ```rust
//! use genco::quote_in;
//! use genco::tokens::{from_fn, ItemStr, FormatInto, static_literal};
//! use genco::lang::Lang;
//!
//! /// Format a block comment, starting with `/**`, and ending in `*/`.
//! pub fn block_comment<I, L>(text: I) -> impl FormatInto<L>
//! where
//!     I: IntoIterator,
//!     I::Item: Into<ItemStr>,
//!     L: Lang,
//! {
//!     from_fn(move |t| {
//!         let mut it = text.into_iter().peekable();
//!
//!         if it.peek().is_some() {
//!             quote_in! { *t =>
//!                 $(static_literal("/**"))
//!                 $(for line in it join ($['\r']) {
//!                     $[' ']* $(line.into())
//!                 })
//!                 $[' ']$(static_literal("*/"))
//!             }
//!         }
//!     })
//! }
//!
//! # fn main() -> genco::fmt::Result {
//! use genco::prelude::*;
//!
//! let tokens: java::Tokens = quote! {
//!     $(block_comment(&["This class is used for awesome stuff", "ok?"]))
//!     public static class Foo {
//!     }
//! };
//!
//! assert_eq!(
//!     vec![
//!         "/**",
//!         " * This class is used for awesome stuff",
//!         " * ok?",
//!         " */",
//!         "public static class Foo {",
//!         "}"
//!     ],
//!     tokens.to_vec()?
//! );
//! # Ok(())
//! # }
//! ```
mod display;
mod format_into;
mod from_fn;
mod internal;
mod item;
mod item_str;
mod quoted;
mod register;
mod static_literal;
mod tokens;
pub use self::display::{display, Display};
pub use self::format_into::FormatInto;
pub use self::from_fn::{from_fn, FromFn};
pub use self::item::Item;
pub use self::item_str::ItemStr;
pub use self::quoted::{quoted, QuotedFn};
pub use self::register::{register, Register, RegisterFn};
pub use self::static_literal::static_literal;
pub use self::tokens::Tokens;
#[doc(hidden)]
pub use self::internal::__lang_item;
#[doc(hidden)]
pub use self::internal::__lang_item_register;