Skip to content

Commit

Permalink
wip: move partial Node and Element to frender-dom
Browse files Browse the repository at this point in the history
  • Loading branch information
EqualMa committed Nov 17, 2023
1 parent 8cfd8eb commit b4e2167
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 54 deletions.
65 changes: 65 additions & 0 deletions crates/frender-dom/src/behaviors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
pub trait Node<Renderer: ?Sized> {
fn cursor_is_at_self(&self, renderer: &Renderer) -> bool;

fn move_cursor_after_self(&mut self, renderer: &mut Renderer);

/// should move cursor
fn readd_self(&mut self, renderer: &mut Renderer, force_reposition: bool);

fn remove_self(&mut self, renderer: &mut Renderer);
}

pub trait Element<Renderer: ?Sized>: Node<Renderer> {
fn move_cursor_at_the_first_child_of_self(&mut self, renderer: &mut Renderer);

fn set_attribute(&mut self, renderer: &mut Renderer, name: &str, value: &str);
fn remove_attribute(&mut self, renderer: &mut Renderer, name: &str);
}

#[cfg(feature = "web")]
impl<N: AsRef<web_sys::Node>, Renderer: ?Sized + crate::csr::web::Renderer> Node<Renderer>
for crate::csr::web::Node<N>
{
fn cursor_is_at_self(&self, renderer: &Renderer) -> bool {
renderer.cursor_is_at_node(self.0.as_ref())
}

fn move_cursor_after_self(&mut self, renderer: &mut Renderer) {
renderer.move_cursor_after_node(self.0.as_ref())
}

fn readd_self(&mut self, renderer: &mut Renderer, force_reposition: bool) {
renderer.readd_node(self.0.as_ref(), force_reposition)
}

fn remove_self(&mut self, renderer: &mut Renderer) {
renderer.remove_node(self.0.as_ref())
}
}

#[cfg(feature = "web")]
impl<
N: AsRef<web_sys::Node> + AsRef<web_sys::Element>,
Renderer: ?Sized + crate::csr::web::Renderer,
> Element<Renderer> for crate::csr::web::Node<N>
{
fn move_cursor_at_the_first_child_of_self(&mut self, renderer: &mut Renderer) {
renderer.move_cursor_at_the_first_child_of_element(self.0.as_ref())
}

fn set_attribute(&mut self, renderer: &mut Renderer, name: &str, value: &str) {
use frender_common::try_behavior::TryWithTryBehavior;

AsRef::<web_sys::Element>::as_ref(&self.0)
.set_attribute(name, value)
.unwrap_with_behavior(&mut renderer.try_behavior())
}

fn remove_attribute(&mut self, renderer: &mut Renderer, name: &str) {
use frender_common::try_behavior::TryWithTryBehavior;

AsRef::<web_sys::Element>::as_ref(&self.0)
.remove_attribute(name)
.unwrap_with_behavior(&mut renderer.try_behavior())
}
}
2 changes: 2 additions & 0 deletions crates/frender-dom/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ pub mod csr;
pub mod component;

pub mod element_types;

pub mod behaviors;
2 changes: 1 addition & 1 deletion crates/frender-element/src/elements/str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use std::ops::Deref;
#[cfg(feature = "StaticText")]
use frender_core::{StaticStr, StaticText};
use frender_html::dom::render::RenderTextFrom;
use frender_html::{html::behaviors::Node, RenderHtml};
use frender_html::{dom::behaviors::Node, RenderHtml};

use crate::{Element, RenderState};

Expand Down
55 changes: 4 additions & 51 deletions crates/frender-html/src/html.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,45 +71,14 @@ crate::def_intrinsic_component_props!(
}

pub trait Node {
verbatim_trait_items!(
fn cursor_is_at_self(&self, renderer: &Renderer) -> bool;

fn move_cursor_after_self(&mut self, renderer: &mut Renderer);

/// should move cursor
fn readd_self(&mut self, renderer: &mut Renderer, force_reposition: bool);

fn remove_self(&mut self, renderer: &mut Renderer);
);

impl_for_web!(
verbatim_trait_items!(
fn cursor_is_at_self(&self, renderer: &Renderer) -> bool {
renderer.cursor_is_at_node(self.0.as_ref())
}

fn move_cursor_after_self(&mut self, renderer: &mut Renderer) {
renderer.move_cursor_after_node(self.0.as_ref())
}

fn readd_self(&mut self, renderer: &mut Renderer, force_reposition: bool) {
renderer.readd_node(self.0.as_ref(), force_reposition)
}

fn remove_self(&mut self, renderer: &mut Renderer) {
renderer.remove_node(self.0.as_ref())
}
);
);
trait_bounds!(frender_dom::behaviors::Node<Renderer>);
impl_for_web!();

sub_traits!(
pub trait Element {
verbatim_trait_items!(
fn move_cursor_at_the_first_child_of_self(&mut self, renderer: &mut Renderer);

fn set_attribute(&mut self, renderer: &mut Renderer, name: &str, value: &str);
fn remove_attribute(&mut self, renderer: &mut Renderer, name: &str);
trait_bounds!(frender_dom::behaviors::Element<Renderer>);

verbatim_trait_items!(
type ClassList<'a>: frender_html_common::dom_token::DomTokenList
where
Self: 'a,
Expand All @@ -119,22 +88,6 @@ crate::def_intrinsic_component_props!(

impl_for_web!(
verbatim_trait_items!(
fn move_cursor_at_the_first_child_of_self(&mut self, renderer: &mut Renderer) {
renderer.move_cursor_at_the_first_child_of_element(self.0.as_ref())
}

fn set_attribute(&mut self, renderer: &mut Renderer, name: &str, value: &str) {
use frender_common::try_behavior::TryWithTryBehavior;

AsRef::<web_sys::Element>::as_ref(&self.0).set_attribute(name, value).unwrap_with_behavior(&mut renderer.try_behavior())
}

fn remove_attribute(&mut self, renderer: &mut Renderer, name: &str) {
use frender_common::try_behavior::TryWithTryBehavior;

AsRef::<web_sys::Element>::as_ref(&self.0).remove_attribute(name).unwrap_with_behavior(&mut renderer.try_behavior())
}

type ClassList<'a> = ::frender_dom::csr::web::DomTokenList<Renderer::TryBehavior<'a>>
where
Self: 'a,
Expand Down
4 changes: 2 additions & 2 deletions crates/frender-html/src/impl_bounds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -379,11 +379,11 @@ pub mod MaybeValue {
}
}

pub fn default_update<V: ?Sized + AsAttributeValue, E: ?Sized + crate::html::behaviors::Element<RR>, RR: ?Sized>(element: &mut E, renderer: &mut RR, prop_name: &'static str, value: &V) {
pub fn default_update<V: ?Sized + AsAttributeValue, E: ?Sized + frender_dom::behaviors::Element<RR>, RR: ?Sized>(element: &mut E, renderer: &mut RR, prop_name: &'static str, value: &V) {
element.set_attribute(renderer, prop_name, &value.as_attribute_value())
}

pub fn default_remove<E: ?Sized + crate::html::behaviors::Element<RR>, RR: ?Sized>(element: &mut E, renderer: &mut RR, prop_name: &'static str) {
pub fn default_remove<E: ?Sized + frender_dom::behaviors::Element<RR>, RR: ?Sized>(element: &mut E, renderer: &mut RR, prop_name: &'static str) {
element.remove_attribute(renderer, prop_name)
}
}
Expand Down
14 changes: 14 additions & 0 deletions crates/frender-html/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ macro_rules! behaviors {
$(special_inter_traits $special_inter_traits:tt)?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds($($trait_bounds:tt)*))?
$(define $define:tt)?
// $(define(
// Props: $Props:ident
Expand All @@ -201,6 +202,7 @@ macro_rules! behaviors {
$vis trait $trait_name<Renderer: ?Sized> :
$($extends<Renderer> +)*
$($($($special_super_traits<Renderer> +)+)?)?
$($($trait_bounds)*)?
{
$($($verbatim_trait_items)*)?

Expand Down Expand Up @@ -233,6 +235,7 @@ macro_rules! behaviors {
where Self:
$($extends<Renderer> +)*
$($($($special_super_traits<Renderer> + )+ )?)?
$($($trait_bounds)*)?
{
$($($($verbatim_trait_items_impl_web)*)?)?

Expand All @@ -254,6 +257,7 @@ macro_rules! behaviors_prelude {
$(special_inter_traits $special_inter_traits:tt)?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define $define:tt)?
// $(define(
// Props: $Props:ident
Expand Down Expand Up @@ -292,6 +296,7 @@ macro_rules! behavior_type_traits {
$(special_inter_traits $special_inter_traits:tt)?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define $define:tt)?
// $(define(
// Props: $Props:ident
Expand Down Expand Up @@ -339,6 +344,7 @@ macro_rules! tags {
$(special_inter_traits $special_inter_traits:tt)?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define(
$(tags: ($($tags:ident),* $(,)?))?
$(,)?
Expand Down Expand Up @@ -390,6 +396,7 @@ macro_rules! attributes {
$(special_inter_traits($($special_inter_traits:ident),* $(,)? ))?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define $define:tt)?
// $(define(
// Props: $Props:ident
Expand Down Expand Up @@ -693,6 +700,7 @@ macro_rules! RenderHtml {
$(special_inter_traits $special_inter_traits:tt)?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define(
$(tags: ($($tags:ident),* $(,)?))?
$(,)?
Expand Down Expand Up @@ -728,6 +736,7 @@ macro_rules! expand_nested_traits {
$vis:vis trait $trait_name:ident {
$(special_super_traits! $special_super_traits:tt;)?
$(special_inter_traits! $special_inter_traits:tt;)?
$(trait_bounds! $trait_bounds:tt;)?
$(define! $define:tt;)?

$(verbatim_trait_items! $verbatim_trait_items:tt;)?
Expand All @@ -754,6 +763,7 @@ macro_rules! expand_nested_traits {
$(special_inter_traits $special_inter_traits)?
vis($vis)
trait_name($trait_name)
$(trait_bounds $trait_bounds)?
$(define $define)?
$(verbatim_trait_items $verbatim_trait_items)?
$(impl_for_web $impl_for_web)?
Expand Down Expand Up @@ -842,6 +852,7 @@ macro_rules! event_types {
$(special_inter_traits $special_inter_traits:tt)?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define $define:tt)?
// $(define(
// Props: $Props:ident
Expand Down Expand Up @@ -902,6 +913,7 @@ macro_rules! event_type_helpers {
$(special_inter_traits $special_inter_traits:tt)?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define $define:tt)?
// $(define(
// Props: $Props:ident
Expand Down Expand Up @@ -1098,6 +1110,7 @@ macro_rules! define_props_builders {
$(special_inter_traits($($special_inter_traits:ident),* $(,)?))?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define $define:tt)?
// $(define(
// Props: $Props:ident
Expand Down Expand Up @@ -1230,6 +1243,7 @@ macro_rules! components {
$(special_inter_traits($($special_inter_traits:ident),* $(,)?))?
vis($vis:vis)
trait_name($trait_name:ident)
$(trait_bounds $trait_bounds:tt)?
$(define(
$(tags: ($($tags:ident),* $(,)?))?
$(,)?
Expand Down

0 comments on commit b4e2167

Please sign in to comment.