extern crate builderx_core as builderx;

use builderx_core::{AttachChild, AttachChildren, BxAdapter, CanAttach, CanAttachMany};
use builderx_macros::bx;

#[derive(Default, Debug, PartialEq)]
struct StubBuilder(Vec<&'static str>);

impl AttachChild<&'static str> for StubBuilder {
    fn attach_child(mut self, child: &'static str) -> Self {
        self.0.push(child);
        self
    }
}

impl AttachChildren<&'static str> for StubBuilder {
    fn attach_children<I>(mut self, children: I) -> Self
    where
        I: IntoIterator<Item = &'static str>,
    {
        self.0.extend(children);
        self
    }
}

struct StubAdapter;

impl BxAdapter for StubAdapter {}

impl CanAttach<StubBuilder, &'static str> for StubAdapter {
    fn do_attach(builder: StubBuilder, child: &'static str) -> StubBuilder {
        builder.attach_child(child)
    }
}

impl<I> CanAttachMany<StubBuilder, I, &'static str> for StubAdapter
where
    I: IntoIterator<Item = &'static str>,
{
    fn do_attach_many(builder: StubBuilder, children: I) -> StubBuilder {
        builder.attach_children(children)
    }
}

#[test]
fn applies_children_and_spreads() {
    let built = bx! { StubAdapter => StubBuilder::default() { "a", "b", ..["c", "d"] } };
    assert_eq!(built, StubBuilder(vec!["a", "b", "c", "d"]));
}
