This crate is the successor of paste crate
Migrating from `paste` crate
Migrating from paste
crate to pastey
is super simple, just change the following in your Cargo.toml
[dependencies]
- paste = "1"
+ pastey = "*" # Or any specific version of pastey
Or even better way:
[dependencies]
- paste = "1"
+ paste = { package = "pastey", version = "*" }
This crate aims to be a drop-in replacement for paste
and doesn't change any existing behaviour while
adding features and fixing bugs. See Case Conversion for more info
Add pastey
as your dependency in Cargo.toml
[dependencies]
# TODO: Replace with latest version available on crates.io
pastey = "*"
This approach works with any Rust compiler 1.54+.
Within the paste!
macro, identifiers inside [<
...>]
are pasted together to
form a single identifier.
use pastey::paste;
paste! {
// Defines a const called `QRST`.
const [<Q R S T>]: &str = "success!";
}
fn main() {
assert_eq!(
paste! { [<Q R S T>].len() },
8,
);
}
The next example shows a macro that generates accessor methods for some struct fields. It demonstrates how you might find it useful to bundle a paste invocation inside of a macro_rules macro.
use pastey::paste;
macro_rules! make_a_struct_and_getters {
($name:ident { $($field:ident),* }) => {
// Define a struct. This expands to:
//
// pub struct S {
// a: String,
// b: String,
// c: String,
// }
pub struct $name {
$(
$field: String,
)*
}
// Build an impl block with getters. This expands to:
//
// impl S {
// pub fn get_a(&self) -> &str { &self.a }
// pub fn get_b(&self) -> &str { &self.b }
// pub fn get_c(&self) -> &str { &self.c }
// }
paste! {
impl $name {
$(
pub fn [<get_ $field>](&self) -> &str {
&self.$field
}
)*
}
}
}
}
make_a_struct_and_getters!(S { a, b, c });
fn call_some_getters(s: &S) -> bool {
s.get_a() == s.get_b() && s.get_c().is_empty()
}
The pastey
crate supports the following case modfiers:
Modifier | Description |
---|---|
$var:lower |
Lower Case |
$var:upper |
Upper Case |
$var:snake |
[Snake Case] |
$var:camel or $var:upper_camel |
Upper Camel Case |
$var:lower_camel |
Lower Camel Case #4 |
$var:camel_edge |
Covers Edge cases of Camel Case. #3 |
NOTE: The pastey crate is going to be a drop in replacement to paste crate,
and will not change the behaviour of existing modifier like lower
, upper
,
snake
and camel
. For modifying the behaviour new modifiers will be created,
like camel_edge
You can also use multiple of these modifers like $var:snake:upper
would give you
SCREAMING_SNAKE_CASE
.
Example
use pastey::paste;
paste! {
const [<LIB env!("CARGO_PKG_NAME"):snake:upper>]: &str = "libpastey";
let _ = LIBPASTEY;
}
The precise Unicode conversions are as defined by str::to_lowercase
and
str::to_uppercase
.
Within the paste!
macro, arguments to a #[doc ...] attribute are implicitly
concatenated together to form a coherent documentation string.
use pastey::paste;
macro_rules! method_new {
($ret:ident) => {
paste! {
#[doc = "Create a new `" $ret "` object."]
pub fn new() -> $ret { todo!() }
}
};
}
pub struct Pastey {}
method_new!(Pastey); // expands to #[doc = "Create a new `Paste` object"]
This crate is the fork of [paste](https://github.com/dtolnay/paste) and I appreciate the efforts of @dtolnay and other contributors. Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.