use std::fmt::{Debug, Display};
#[macro_export]
macro_rules! try_to_string {
(&$value:expr) => {{
use phlow::printing::{
TryToStringFallback, TryToStringViaDebug, TryToStringViaDisplay, TryToStringViaString,
};
(&&&phlow::printing::TryToString(&$value)).try_to_phlow_string()
}};
($value:expr) => {{
use phlow::printing::{
TryToStringFallback, TryToStringViaDebug, TryToStringViaDisplay, TryToStringViaString,
};
(&&&phlow::printing::TryToString(&$value)).try_to_phlow_string()
}};
}
#[macro_export]
macro_rules! to_string {
(&$value:expr) => {{
use phlow::printing::{
TryToStringFallback, TryToStringViaDebug, TryToStringViaDisplay, TryToStringViaString,
};
(&&&phlow::printing::TryToString(&$value)).to_phlow_string()
}};
($value:expr) => {{
use phlow::printing::{
TryToStringFallback, TryToStringViaDebug, TryToStringViaDisplay, TryToStringViaString,
};
(&&&phlow::printing::TryToString(&$value)).to_phlow_string()
}};
}
pub struct TryToString<'a, T>(pub &'a T);
pub trait TryToStringViaString {
fn try_to_phlow_string(&self) -> Option<String> {
Some(self.to_phlow_string())
}
fn to_phlow_string(&self) -> String;
}
impl TryToStringViaString for &&&TryToString<'_, String> {
fn to_phlow_string(&self) -> String {
self.0.clone()
}
}
pub trait TryToStringViaDisplay {
fn try_to_phlow_string(&self) -> Option<String> {
Some(self.to_phlow_string())
}
fn to_phlow_string(&self) -> String;
}
impl<T: Display> TryToStringViaDisplay for &&TryToString<'_, T> {
fn to_phlow_string(&self) -> String {
self.0.to_string()
}
}
pub trait TryToStringViaDebug {
fn try_to_phlow_string(&self) -> Option<String> {
Some(self.to_phlow_string())
}
fn to_phlow_string(&self) -> String;
}
impl<T: Debug> TryToStringViaDebug for &TryToString<'_, T> {
fn to_phlow_string(&self) -> String {
format!("{:?}", self.0)
}
}
pub trait TryToStringFallback {
fn try_to_phlow_string(&self) -> Option<String>;
fn to_phlow_string(&self) -> String;
}
impl<T> TryToStringFallback for TryToString<'_, T> {
fn try_to_phlow_string(&self) -> Option<String> {
None
}
fn to_phlow_string(&self) -> String {
std::any::type_name::<T>().to_string()
}
}