#const #concat #byte-slice #expressions #variables #build

no-std constcat

concat! with support for const variables and expressions

10 releases (5 breaking)

0.6.0 Jan 28, 2025
0.5.1 Oct 5, 2024
0.5.0 Feb 29, 2024
0.4.0 Nov 3, 2023
0.1.1 Mar 30, 2022

#65 in Rust patterns

Download history 69940/week @ 2024-10-22 60826/week @ 2024-10-29 77107/week @ 2024-11-05 65059/week @ 2024-11-12 64340/week @ 2024-11-19 62740/week @ 2024-11-26 61973/week @ 2024-12-03 60617/week @ 2024-12-10 50021/week @ 2024-12-17 18949/week @ 2024-12-24 31954/week @ 2024-12-31 59991/week @ 2025-01-07 79595/week @ 2025-01-14 66406/week @ 2025-01-21 61705/week @ 2025-01-28 59866/week @ 2025-02-04

281,026 downloads per month
Used in 430 crates (29 directly)

MIT/Apache

15KB
119 lines

constcat

Crates.io Version Docs.rs Latest Build Status

std::concat! with support for const variables and expressions.

Works on stable Rust ✨.

🚀 Getting started

Add constcat to your Cargo manifest.

cargo add constcat

Import the macro using the following.

use constcat::concat;

🤸 Usage

String slices

concat! works exactly like std::concat!, concatenating &str literals into a static string slice, except you can now pass variables and constant expressions.

const CRATE_NAME: &str = env!("CARGO_PKG_NAME");
const CRATE_VERSION: &str = env!("CARGO_PKG_VERSION");
const fn tada() -> &'static str { "🎉" }
const VERSION: &str = concat!(CRATE_NAME, " ", CRATE_VERSION, tada());

Byte slices

concat_bytes! works similarly to concat!, concatenating const &[u8] expressions and literals into a static byte slice.

const VERSION: u32 = 1;
const fn entries() -> &'static [u8] { b"example" }
const HEADER: &[u8] = concat_bytes!(&VERSION.to_le_bytes(), entries());

T slices

concat_slices! is the underlying macro used for both of the above, this can be used to concatenate const &[T] expressions into a static slice.

This macro requires the type of slice to be specified in the form [T]: before the comma separated expressions.

const MAGIC: &[i32; 4] = &[1, 3, 3, 7];
const VERSION: i32 = 1;
const HEADER: &[i32] = concat_slices!([i32]: MAGIC, &[0, VERSION]);
const PRIMARIES: &'static [(u8, u8, u8)] = &[(255, 0, 0), (0, 255, 0), (0, 0, 255)];
const SECONDARIES: &'static [(u8, u8, u8)] = &[(255, 255, 0), (255, 0, 255), (0, 255, 255)];
const COLORS: &[(u8, u8, u8)] = concat_slices!([(u8, u8, u8)]: PRIMARIES, SECONDARIES);

MSRV

This crate supports Rust 1.66 and above.

License

This project is distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT for details.

No runtime deps