1- use frender_html:: { dom:: csr:: web:: Node , dom :: render:: RenderTextFrom } ;
1+ use frender_html:: dom:: { csr:: web:: Node , render:: RenderTextFrom } ;
22
33use super :: Renderer ;
44
@@ -31,16 +31,16 @@ mod js_shims {
3131 }
3232}
3333
34- mod to_js_string {
34+ mod into_js_string {
3535 use wasm_bindgen:: JsValue ;
3636
37- pub ( super ) trait ToJsString {
38- fn to_js_string ( & self ) -> js_sys:: JsString ;
37+ pub ( super ) trait IntoJsString {
38+ fn into_js_string ( self ) -> js_sys:: JsString ;
3939 }
4040
41- impl ToJsString for char {
42- fn to_js_string ( & self ) -> js_sys:: JsString {
43- From :: from ( * self )
41+ impl IntoJsString for char {
42+ fn into_js_string ( self ) -> js_sys:: JsString {
43+ From :: from ( self )
4444 }
4545 }
4646
@@ -56,88 +56,124 @@ mod to_js_string {
5656 }
5757
5858 impl_for_each_of ! (
59- impl <__> ToJsString
59+ impl <__> IntoJsString
6060 for each_of! {
6161 i8 , u8 , i16 , u16 , i32 , u32 , i64 , u64 , i128 , u128 , isize , usize ,
6262 f32 , f64 ,
63- bool ,
6463 }
6564 {
66- fn to_js_string ( & self ) -> js_sys:: JsString {
67- super :: js_shims:: js_string( JsValue :: from( * self ) )
65+ fn into_js_string ( self ) -> js_sys:: JsString {
66+ super :: js_shims:: js_string( JsValue :: from( self ) )
6867 }
6968 }
7069 ) ;
7170}
7271
73- mod to_text_node {
72+ mod into_text_node {
73+ use std:: { borrow:: Cow , rc:: Rc , sync:: Arc } ;
74+
75+ use wasm_bindgen:: JsCast as _;
76+
77+ use frender_common:: {
78+ impl_many, strings:: AsRefStr as _, value_kind:: StaticRefOrTempOwned , TempStr ,
79+ } ;
7480 use frender_html:: dom:: string_element:: StringElement ;
7581
7682 use super :: Renderer ;
7783
78- pub ( super ) trait ToTextNode {
79- fn to_text_node ( & self , renderer : & mut Renderer ) -> web_sys:: Text ;
84+ pub ( super ) trait IntoTextNode {
85+ fn into_text_node ( self , renderer : & mut Renderer ) -> web_sys:: Text ;
8086
81- fn update_text_node ( & self , renderer : & mut Renderer , text : & web_sys:: Text ) ;
87+ fn update_text_node ( self , renderer : & mut Renderer , text : & web_sys:: Text ) ;
8288 }
8389
84- impl < V : ?Sized + super :: to_js_string:: ToJsString > ToTextNode for V {
85- fn to_text_node ( & self , renderer : & mut Renderer ) -> web_sys:: Text {
86- use wasm_bindgen:: JsCast ;
90+ impl < V : super :: into_js_string:: IntoJsString > IntoTextNode for V {
91+ fn into_text_node ( self , renderer : & mut Renderer ) -> web_sys:: Text {
8792 super :: js_shims:: Document :: create_text_node (
8893 renderer. document . unchecked_ref ( ) ,
89- self . to_js_string ( ) ,
94+ self . into_js_string ( ) ,
9095 )
9196 }
9297
93- fn update_text_node ( & self , _: & mut Renderer , text : & web_sys:: Text ) {
94- use wasm_bindgen:: JsCast ;
95- super :: js_shims:: Text :: set_data ( text. unchecked_ref ( ) , self . to_js_string ( ) )
98+ fn update_text_node ( self , _: & mut Renderer , text : & web_sys:: Text ) {
99+ super :: js_shims:: Text :: set_data ( text. unchecked_ref ( ) , self . into_js_string ( ) )
96100 }
97101 }
98102
99- impl ToTextNode for str {
100- fn to_text_node ( & self , renderer : & mut Renderer ) -> web_sys:: Text {
101- renderer. document . create_text_node ( self )
103+ impl_many ! (
104+ impl <__> IntoTextNode
105+ for each_of![
106+ //
107+ & ' static str ,
108+ String ,
109+ Cow <' static , str >,
110+ TempStr <& str >,
111+ StaticRefOrTempOwned <' _, str >,
112+ Rc <str >,
113+ & Rc <str >,
114+ Arc <str >,
115+ & Arc <str >,
116+ ]
117+ {
118+ fn into_text_node( self , renderer: & mut Renderer ) -> web_sys:: Text {
119+ renderer. document. create_text_node( self . as_ref_str( ) )
120+ }
121+
122+ fn update_text_node( self , _: & mut Renderer , text: & web_sys:: Text ) {
123+ text. set_data( self . as_ref_str( ) )
124+ }
125+ }
126+ ) ;
127+
128+ impl IntoTextNode for StringElement {
129+ fn into_text_node ( self , renderer : & mut Renderer ) -> web_sys:: Text {
130+ match self . into_js_string ( ) {
131+ Ok ( this) => super :: js_shims:: Document :: create_text_node (
132+ renderer. document . unchecked_ref ( ) ,
133+ this,
134+ ) ,
135+ Err ( this) => renderer. document . create_text_node ( & this) ,
136+ }
102137 }
103138
104- fn update_text_node ( & self , _: & mut Renderer , text : & web_sys:: Text ) {
105- text. set_data ( self )
139+ fn update_text_node ( self , _: & mut Renderer , text : & web_sys:: Text ) {
140+ match self . into_js_string ( ) {
141+ Ok ( this) => super :: js_shims:: Text :: set_data ( text. unchecked_ref ( ) , this) ,
142+ Err ( this) => text. set_data ( & this) ,
143+ }
106144 }
107145 }
108146
109- impl ToTextNode for StringElement {
110- fn to_text_node ( & self , renderer : & mut Renderer ) -> web_sys:: Text {
147+ impl IntoTextNode for & StringElement {
148+ fn into_text_node ( self , renderer : & mut Renderer ) -> web_sys:: Text {
111149 match self . as_js_string ( ) {
112- Ok ( this) => {
113- use wasm_bindgen:: JsCast ;
114- super :: js_shims:: Document :: create_text_node_ref (
115- renderer. document . unchecked_ref ( ) ,
116- this,
117- )
118- }
119- Err ( this) => renderer. document . create_text_node ( this) ,
150+ Ok ( this) => super :: js_shims:: Document :: create_text_node_ref (
151+ renderer. document . unchecked_ref ( ) ,
152+ this,
153+ ) ,
154+ Err ( this) => renderer. document . create_text_node ( & this) ,
120155 }
121156 }
122157
123- fn update_text_node ( & self , _: & mut Renderer , text : & web_sys:: Text ) {
158+ fn update_text_node ( self , _: & mut Renderer , text : & web_sys:: Text ) {
124159 match self . as_js_string ( ) {
125- Ok ( this) => {
126- use wasm_bindgen:: JsCast ;
127- super :: js_shims:: Text :: set_data_ref ( text. unchecked_ref ( ) , this)
128- }
129- Err ( this) => text. set_data ( this) ,
160+ Ok ( this) => super :: js_shims:: Text :: set_data_ref ( text. unchecked_ref ( ) , this) ,
161+ Err ( this) => text. set_data ( & this) ,
130162 }
131163 }
132164 }
133165}
134166
135- impl < V : ?Sized + to_text_node:: ToTextNode > RenderTextFrom < Node < web_sys:: Text > , V > for Renderer {
136- fn render_text_from ( & mut self , v : & V ) -> Node < web_sys:: Text > {
137- Node ( v. to_text_node ( self ) )
167+ impl < V : into_text_node:: IntoTextNode > RenderTextFrom < V > for Renderer {
168+ type Text = Node < web_sys:: Text > ;
169+
170+ fn render_text_from ( render_context : & mut Self :: RenderContext < ' _ > , v : V ) -> Self :: Text {
171+ let text = v. into_text_node ( render_context. renderer ) ;
172+ <Self as frender_html:: dom:: csr:: web:: Renderer >:: mount_node ( render_context, & text) ;
173+ Node ( text)
138174 }
139175
140- fn update_text_from ( & mut self , text : & mut Node < web_sys :: Text > , v : & V ) {
176+ fn update_text_from ( & mut self , text : & mut Self :: Text , v : V ) {
141177 v. update_text_node ( self , & text. 0 )
142178 }
143179}
0 commit comments