pw_format_core/pw_format_core.rs
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
// Copyright 2024 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#![no_std]
//! Core support code for code generated by `pw_format` macros
//!
//! The contents of this crate are primarily used by code which is generated
//! by macros using `pw_format`.
/// Trait used to produce printf style format strings for untyped format
/// specifiers.
///
/// The const [`PrintfFormatter::FORMAT_ARG`] is used to provide the printf
/// format specifier (i.e. the `d` in `%02d`) for a given type in Rust. This
/// must be const so that it can be used to build static const format strings at
/// compile time.
pub trait PrintfFormatter {
/// The format specifier for this type.
const FORMAT_ARG: &'static str;
}
/// Trait used to produce printf style format strings for hex formatted untyped
/// format specifiers.
///
/// The const [`PrintfHexFormatter::FORMAT_ARG`] is used to provide the printf
/// format specifier (i.e. the `x` in `%02x`) for a given type in Rust. This
/// must be const so that it can be used to build static const format strings at
/// compile time.
pub trait PrintfHexFormatter {
/// The format specifier for this type.
const FORMAT_ARG: &'static str;
}
/// Trait used to produce printf style format strings for upper case hex
/// formatted untyped format specifiers.
///
/// The const [`PrintfUpperHexFormatter::FORMAT_ARG`] is used to provide the
/// printf format specifier (i.e. the `x` in `%02x`) for a given type in Rust.
/// This must be const so that it can be used to build static const format
/// strings at compile time.
pub trait PrintfUpperHexFormatter {
/// The format specifier for this type.
const FORMAT_ARG: &'static str;
}
/// A helper to declare a [`PrintfFormatter`] trait and optionally
/// [`PrintfHexFormatter`] and [`PrintfUpperHexFormatter`] traits for a given
/// type.
macro_rules! declare_formatter {
($ty:ty, $specifier:literal, $hex_specifier:literal, $upper_hex_specifier:literal) => {
impl PrintfFormatter for $ty {
const FORMAT_ARG: &'static str = $specifier;
}
impl PrintfHexFormatter for $ty {
const FORMAT_ARG: &'static str = $hex_specifier;
}
impl PrintfUpperHexFormatter for $ty {
const FORMAT_ARG: &'static str = $upper_hex_specifier;
}
};
($ty:ty, $specifier:literal) => {
impl PrintfFormatter for $ty {
const FORMAT_ARG: &'static str = $specifier;
}
};
}
declare_formatter!(i32, "d");
declare_formatter!(u32, "u", "x", "X");
declare_formatter!(&str, "s");