use crate::{
Bluegum,
BluegumWithState,
Builder,
};
impl Bluegum for () {
fn node(&self, b: &mut crate::Builder) {
b.name("Unit");
}
}
impl<T> Bluegum for Vec<T>
where
T: Bluegum,
{
fn node(&self, b: &mut crate::Builder) {
b.name("Vec").add_nodes("items", self);
}
}
impl<T1, T2> Bluegum for (T1, T2)
where
T1: Bluegum,
T2: Bluegum,
{
fn node(&self, b: &mut crate::Builder) {
b.name("(T1,T2)")
.add_node("T1", &self.0)
.add_node("T2", &self.1);
}
}
impl<State> BluegumWithState<State> for () {
fn node_with_state(&self, b: &mut crate::Builder, _state: &State) {
b.name("Unit");
}
}
impl<State, T> BluegumWithState<State> for Vec<T>
where
T: BluegumWithState<State>,
{
fn node_with_state(&self, b: &mut crate::Builder, state: &State) {
b.add_builders(
self
.iter()
.map(|node| Builder::render_with_state(node, state))
.collect::<Vec<Builder>>(),
);
}
}
impl<State, T1, T2> BluegumWithState<State> for (T1, T2)
where
T1: BluegumWithState<State>,
T2: BluegumWithState<State>,
{
fn node_with_state(&self, b: &mut crate::Builder, state: &State) {
b.name("(T1,T2)")
.add_node("T1", &self.0)
.add_node("T2", &self.1);
}
}
pub struct Leaf<'a> {
name: String,
fields: Vec<(&'a str, String)>,
}
impl<'a> Leaf<'a> {
pub fn new(name: String, fields: &[(&'a str, String)]) -> Self {
Self {
name,
fields: fields.into(),
}
}
}
impl Bluegum for Leaf<'_> {
fn node(&self, b: &mut crate::Builder) {
b.name(&self.name);
for (name, value) in &self.fields {
b.field(name, value);
}
}
}
macro_rules! impl_bluegum_for_primitive {
($($ty:ty),* $(,)?) => {
$(
impl $crate::Bluegum for $ty {
fn node(&self, b: &mut $crate::Builder) {
b.name(stringify!($ty)).alt(&format!("{:?}", self));
}
}
impl<State> $crate::BluegumWithState<State> for $ty {
fn node_with_state(&self, b: &mut $crate::Builder, _state: &State) {
b.name(stringify!($ty)).alt(&format!("{:?}", self));
}
}
)*
};
}
impl_bluegum_for_primitive! {
u8, u16, u32, u64, u128, usize,
i8, i16, i32, i64, i128, isize,
f32, f64,
bool,
char,
String,
}