68 lines
2.6 KiB
Rust
68 lines
2.6 KiB
Rust
// Copyright 2024 Google LLC
|
|
//
|
|
// 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
|
|
//
|
|
// http://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.
|
|
|
|
/// Functions for use only by the procedural macros in this module.
|
|
///
|
|
/// **For internal use only. API stablility is not guaranteed!**
|
|
#[doc(hidden)]
|
|
pub mod internal {
|
|
use std::fmt::{Debug, Write};
|
|
|
|
/// Wrapper to allow for inherent-method specialization based on whether a
|
|
/// type implements `Debug`.
|
|
pub struct FormatWrapper<'a, T: ?Sized>(pub &'a T);
|
|
|
|
/// Default implementation to render values that implement `Debug`.
|
|
///
|
|
/// Used for autoref specialization to conditionally
|
|
/// render only values that implement `Debug`. See also
|
|
/// [`FormatNonDebugFallback`].
|
|
impl<T: Debug + ?Sized> FormatWrapper<'_, T> {
|
|
#[track_caller]
|
|
pub fn __googletest_write_expr_value(&self, output: &mut dyn Write, expr_label: &str) {
|
|
write!(output, "\n {} = {:?},", expr_label, self.0)
|
|
.expect("Formatting to String should never fail");
|
|
}
|
|
}
|
|
|
|
/// Fallback implementation for rendering values for non-`Debug` types..
|
|
///
|
|
/// Used for inherent-method specialization to conditionally render only
|
|
/// values that implement `Debug`. See also the specialized inherent impl on
|
|
/// [`FormatWrapper`] above.
|
|
pub trait FormatNonDebugFallback {
|
|
fn __googletest_write_expr_value(&self, output: &mut dyn Write, expr_label: &str);
|
|
}
|
|
|
|
impl<T: ?Sized> FormatNonDebugFallback for FormatWrapper<'_, T> {
|
|
#[track_caller]
|
|
fn __googletest_write_expr_value(&self, output: &mut dyn Write, expr_label: &str) {
|
|
write!(output, "\n {expr_label} does not implement Debug,")
|
|
.expect("Formatting to String should never fail");
|
|
}
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! __googletest__write_expr_value(
|
|
($output:expr, $expr_str:expr, $value:expr $(,)?) => {
|
|
{
|
|
use $crate::fmt::internal::FormatNonDebugFallback as _;
|
|
$crate::fmt::internal::FormatWrapper(&$value)
|
|
.__googletest_write_expr_value(&mut $output, $expr_str)
|
|
}
|
|
}
|
|
);
|
|
pub use __googletest__write_expr_value;
|
|
}
|