Skip to content

Commit 9f674b9

Browse files
committed
feat!: redesign SsrComponent
1 parent af63454 commit 9f674b9

File tree

8 files changed

+74
-80
lines changed

8 files changed

+74
-80
lines changed

packages/frender-dom/src/component.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,31 @@ pub trait HasIntrinsicComponentTag {
1010

1111
pub trait SsrComponentNormalElement: HasIntrinsicComponentTag {}
1212

13-
pub trait SsrComponent<Attrs: IntoSpaceAndHtmlAttributesOrEmpty, Children>:
14-
HasIntrinsicComponentTag
15-
{
16-
type OneElement: frender_ssr::html::assert::OneElement;
17-
fn ssr_component(attrs: Attrs, children: Children) -> Self::OneElement;
13+
pub trait SsrComponent<Children>: HasIntrinsicComponentTag {
14+
type OneElement<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>: frender_ssr::html::assert::OneElement;
15+
fn ssr_component<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>(
16+
self,
17+
attrs: Attrs,
18+
children: Children,
19+
) -> Self::OneElement<Attrs>;
1820
}
1921

20-
impl<C, Attrs: IntoSpaceAndHtmlAttributesOrEmpty, Children: SsrElement>
21-
SsrComponent<Attrs, Children> for C
22+
impl<C, Children: SsrElement> SsrComponent<Children> for C
2223
where
2324
C: SsrComponentNormalElement,
2425
{
25-
type OneElement = frender_ssr::html::element::NormalElement<
26-
AssertTagName<&'static str>,
27-
<Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty,
28-
Children::HtmlChildren,
29-
>;
26+
type OneElement<Attrs: IntoSpaceAndHtmlAttributesOrEmpty> =
27+
frender_ssr::html::element::NormalElement<
28+
AssertTagName<&'static str>,
29+
<Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty,
30+
Children::HtmlChildren,
31+
>;
3032

31-
fn ssr_component(attrs: Attrs, children: Children) -> Self::OneElement {
33+
fn ssr_component<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>(
34+
self,
35+
attrs: Attrs,
36+
children: Children,
37+
) -> Self::OneElement<Attrs> {
3238
frender_ssr::html::element::NormalElement::new(
3339
C::ASSERT_TAG_NAME,
3440
attrs.into_space_and_html_attributes_or_empty(),

packages/frender-html/src/intrinsic/csr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ where
179179
// ssr bounds
180180
// TODO: remove ssr bounds from csr implementations
181181
Attrs: crate::dom::component::IntoSpaceAndHtmlAttributesOrEmpty,
182-
C: crate::dom::component::SsrComponent<Attrs, Children>,
182+
C: crate::dom::component::SsrComponent<Children>,
183183
{
184184
type RenderStateKind = Kind<C, C::ChildrenRenderStateKind, Attrs, AttrsWithPinnedState>; // TODO: shouldn't be generic over P
185185

packages/frender-html/src/intrinsic/ssr.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@ use frender_ssr::SsrElement;
33

44
impl<TM, Children, Attrs, AttrsWithPinnedState> SsrElement for super::Intrinsic<TM, Children, Attrs, AttrsWithPinnedState>
55
where
6-
TM: SsrComponent<Attrs, Children>,
6+
TM: SsrComponent<Children>,
77
Attrs: IntoSpaceAndHtmlAttributesOrEmpty,
88
// AttrsWithPinnedState are considered csr only
99
{
10-
type HtmlChildren = TM::OneElement;
10+
type HtmlChildren = TM::OneElement<Attrs>;
1111

1212
fn into_html_children(self) -> Self::HtmlChildren {
1313
let Self {
14-
type_marker: _,
14+
type_marker,
1515
attributes,
1616
attributes_with_pinned_state: _,
1717
children,
1818
} = self;
1919

20-
TM::ssr_component(attributes, children)
20+
type_marker.ssr_component(attributes, children)
2121
}
2222
}

packages/frender-html/src/special/input.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,8 @@ mod ssr {
99
html::components::input,
1010
};
1111

12-
impl<
13-
//
14-
Attrs: IntoSpaceAndHtmlAttributesOrEmpty,
15-
DataModel: IntoInputDataModel,
16-
> SsrComponent<Attrs, DataModel> for input::Marker
17-
{
18-
type OneElement = frender_ssr::html::element::VoidElement<
12+
impl<DataModel: IntoInputDataModel> SsrComponent<DataModel> for input::Marker {
13+
type OneElement<Attrs: IntoSpaceAndHtmlAttributesOrEmpty> = frender_ssr::html::element::VoidElement<
1914
//
2015
AssertTagName<&'static str>,
2116
<(
@@ -25,9 +20,9 @@ mod ssr {
2520
) as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty,
2621
>;
2722

28-
fn ssr_component(attrs: Attrs, data_model: DataModel) -> Self::OneElement {
23+
fn ssr_component<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>(self, attrs: Attrs, data_model: DataModel) -> Self::OneElement<Attrs> {
2924
let data_model = data_model.into_input_data_model();
30-
Self::OneElement::new(Self::ASSERT_TAG_NAME, (attrs, data_model).into_space_and_html_attributes_or_empty())
25+
Self::OneElement::<Attrs>::new(Self::ASSERT_TAG_NAME, (attrs, data_model).into_space_and_html_attributes_or_empty())
3126
}
3227
}
3328
}

packages/frender-html/src/special/script.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use frender_dom::{
66

77
use crate::{element_types::RenderStateWithPehKind, elements::non_reactive::NonReactiveRenderState, html::components::script, kinds::KindOfNonReactive, CsrComponent};
88

9-
impl<Attrs: IntoSpaceAndHtmlAttributesOrEmpty, Children: IntoScriptContent> SsrComponent<Attrs, Children> for script::Marker {
10-
type OneElement = frender_ssr::html::element::ScriptElement<<Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty, Children::IntoScriptContent>;
9+
impl<Children: IntoScriptContent> SsrComponent<Children> for script::Marker {
10+
type OneElement<Attrs: IntoSpaceAndHtmlAttributesOrEmpty> = frender_ssr::html::element::ScriptElement<<Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty, Children::IntoScriptContent>;
1111

12-
fn ssr_component(attrs: Attrs, children: Children) -> Self::OneElement {
13-
Self::OneElement::new(attrs.into_space_and_html_attributes_or_empty(), IntoScriptContent::into_script_content(children))
12+
fn ssr_component<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>(self, attrs: Attrs, children: Children) -> Self::OneElement<Attrs> {
13+
Self::OneElement::<Attrs>::new(attrs.into_space_and_html_attributes_or_empty(), IntoScriptContent::into_script_content(children))
1414
}
1515
}
1616

packages/frender-html/src/special/style.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ mod ssr {
77

88
use crate::html::components::style;
99

10-
impl<Attrs: IntoSpaceAndHtmlAttributesOrEmpty, Children: SsrStr> SsrComponent<Attrs, Children> for style::Marker {
11-
type OneElement = frender_ssr::html::element::StyleElement<<Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty, IterAnyStr<Children::StaticStr>>;
10+
impl<Children: SsrStr> SsrComponent<Children> for style::Marker {
11+
type OneElement<Attrs: IntoSpaceAndHtmlAttributesOrEmpty> = frender_ssr::html::element::StyleElement<<Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty, IterAnyStr<Children::StaticStr>>;
1212

13-
fn ssr_component(attrs: Attrs, children: Children) -> Self::OneElement {
14-
Self::OneElement::new(attrs.into_space_and_html_attributes_or_empty(), IterAnyStr::new(children.into_into_static_str().into_static_str()))
13+
fn ssr_component<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>(self, attrs: Attrs, children: Children) -> Self::OneElement<Attrs> {
14+
Self::OneElement::<Attrs>::new(attrs.into_space_and_html_attributes_or_empty(), IterAnyStr::new(children.into_into_static_str().into_static_str()))
1515
}
1616
}
1717
}

packages/frender-html/src/special/textarea.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@ pub mod ssr {
3232
Children,
3333
>;
3434

35-
impl<Attrs: IntoSpaceAndHtmlAttributesOrEmpty, Children> SsrComponent<Attrs, Children> for textarea::Marker
35+
impl<Children> SsrComponent<Children> for textarea::Marker
3636
where
3737
Children: SsrTextAreaValue,
3838
{
39-
type OneElement = Element<
39+
type OneElement<Attrs: IntoSpaceAndHtmlAttributesOrEmpty> = Element<
4040
//
4141
Attrs::SpaceAndHtmlAttributesOrEmpty,
4242
Children::IntoSsrTextAreaValue,
4343
>;
4444

45-
fn ssr_component(attrs: Attrs, children: Children) -> Self::OneElement {
45+
fn ssr_component<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>(self, attrs: Attrs, children: Children) -> Self::OneElement<Attrs> {
4646
use frender_dom::component::HasIntrinsicComponentTag;
4747
frender_ssr::html::element::NormalElement::new(Self::ASSERT_TAG_NAME, attrs.into_space_and_html_attributes_or_empty(), Children::into_ssr_text_area_value(children))
4848
}

packages/frender-html/src/special/void_elements.rs

Lines changed: 35 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,55 +5,48 @@ use frender_ssr::html::tag::AssertTagName;
55
use crate::{html::markers as tags, CsrComponent, RenderHtml};
66

77
frender_common::impl_many!(
8-
impl<__>
9-
(
10-
Generics![Attrs: IntoSpaceAndHtmlAttributesOrEmpty],
11-
Trait![SsrComponent<Attrs, Empty>],
12-
each_of![
13-
tags::area,
14-
tags::base,
15-
tags::br,
16-
tags::col,
17-
tags::embed,
18-
tags::hr,
19-
tags::img,
20-
// tags::input, // input is special
21-
tags::link,
22-
tags::meta,
23-
tags::source,
24-
tags::track,
25-
tags::wbr,
26-
],
27-
)
8+
impl<__> SsrComponent<Empty>
9+
for each_of![
10+
tags::area,
11+
tags::base,
12+
tags::br,
13+
tags::col,
14+
tags::embed,
15+
tags::hr,
16+
tags::img,
17+
// tags::input, // input is special
18+
tags::link,
19+
tags::meta,
20+
tags::source,
21+
tags::track,
22+
tags::wbr,
23+
]
2824
{
29-
type OneElement = frender_ssr::html::element::VoidElement<AssertTagName<&'static str>, <Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty>;
25+
type OneElement<Attrs: IntoSpaceAndHtmlAttributesOrEmpty> = frender_ssr::html::element::VoidElement<AssertTagName<&'static str>, <Attrs as IntoSpaceAndHtmlAttributesOrEmpty>::SpaceAndHtmlAttributesOrEmpty>;
3026

31-
fn ssr_component(attrs: Attrs, Empty: Empty) -> Self::OneElement {
32-
Self::OneElement::new(Self::ASSERT_TAG_NAME, attrs.into_space_and_html_attributes_or_empty())
27+
fn ssr_component<Attrs: IntoSpaceAndHtmlAttributesOrEmpty>(self, attrs: Attrs, Empty: Empty) -> Self::OneElement<Attrs> {
28+
Self::OneElement::<Attrs>::new(Self::ASSERT_TAG_NAME, attrs.into_space_and_html_attributes_or_empty())
3329
}
3430
}
3531
);
3632

3733
frender_common::impl_many!(
38-
impl<__>
39-
(
40-
Trait![CsrComponent<Empty>],
41-
each_of![
42-
tags::area,
43-
tags::base,
44-
tags::br,
45-
tags::col,
46-
tags::embed,
47-
tags::hr,
48-
tags::img,
49-
// tags::input, // input is special
50-
tags::link,
51-
tags::meta,
52-
tags::source,
53-
tags::track,
54-
tags::wbr,
55-
],
56-
)
34+
impl<__> CsrComponent<Empty>
35+
for each_of![
36+
tags::area,
37+
tags::base,
38+
tags::br,
39+
tags::col,
40+
tags::embed,
41+
tags::hr,
42+
tags::img,
43+
// tags::input, // input is special
44+
tags::link,
45+
tags::meta,
46+
tags::source,
47+
tags::track,
48+
tags::wbr,
49+
]
5750
{
5851
type ChildrenRenderStateKind = crate::kinds::KindOfNoState;
5952
fn children_render_update<R: RenderHtml + ?Sized>(self, Empty: Empty, _: &mut Self::Element<R>, _: &mut R, _: std::pin::Pin<&mut ()>) {}

0 commit comments

Comments
 (0)