@@ -113,23 +113,33 @@ pub fn code_extract(
113113pub fn object_to_typography ( obj : Object , level : u8 ) -> Result < Typography , JsValue > {
114114 Ok ( Typography :: new (
115115 Reflect :: get ( & obj, & JsValue :: from_str ( "fontFamily" ) )
116- . map ( |v| v. as_string ( ) )
116+ . as_ref ( )
117+ . map ( js_value_to_string)
117118 . unwrap_or ( None ) ,
118119 Reflect :: get ( & obj, & JsValue :: from_str ( "fontSize" ) )
119- . map ( |v| v. as_string ( ) )
120+ . as_ref ( )
121+ . map ( js_value_to_string)
120122 . unwrap_or ( None ) ,
121123 Reflect :: get ( & obj, & JsValue :: from_str ( "fontWeight" ) )
122- . map ( |v| v. as_string ( ) )
124+ . as_ref ( )
125+ . map ( js_value_to_string)
123126 . unwrap_or ( None ) ,
124127 Reflect :: get ( & obj, & JsValue :: from_str ( "lineHeight" ) )
125- . map ( |v| v. as_string ( ) )
128+ . as_ref ( )
129+ . map ( js_value_to_string)
126130 . unwrap_or ( None ) ,
127131 Reflect :: get ( & obj, & JsValue :: from_str ( "letterSpacing" ) )
128- . map ( |v| v. as_string ( ) )
132+ . as_ref ( )
133+ . map ( js_value_to_string)
129134 . unwrap_or ( None ) ,
130135 level,
131136 ) )
132137}
138+ pub fn js_value_to_string ( js_value : & JsValue ) -> Option < String > {
139+ js_value
140+ . as_string ( )
141+ . or_else ( || js_value. as_f64 ( ) . map ( |v| v. to_string ( ) ) )
142+ }
133143
134144fn theme_object_to_hashmap ( js_value : JsValue ) -> Result < Theme , JsValue > {
135145 let mut theme = Theme :: default ( ) ;
@@ -229,10 +239,12 @@ pub fn get_theme_interface(
229239 package_name : & str ,
230240 color_interface_name : & str ,
231241 typography_interface_name : & str ,
232- ) -> Result < String , JsValue > {
242+ theme_interface_name : & str ,
243+ ) -> String {
233244 let sheet = GLOBAL_STYLE_SHEET . lock ( ) . unwrap ( ) ;
234245 let mut color_keys = HashSet :: new ( ) ;
235246 let mut typography_keys = HashSet :: new ( ) ;
247+ let mut theme_keys = HashSet :: new ( ) ;
236248 for color_theme in sheet. theme . colors . themes . values ( ) {
237249 color_theme. keys ( ) . for_each ( |key| {
238250 color_keys. insert ( key. clone ( ) ) ;
@@ -242,11 +254,15 @@ pub fn get_theme_interface(
242254 typography_keys. insert ( key. clone ( ) ) ;
243255 } ) ;
244256
257+ sheet. theme . colors . themes . keys ( ) . for_each ( |key| {
258+ theme_keys. insert ( key. clone ( ) ) ;
259+ } ) ;
260+
245261 if color_keys. is_empty ( ) && typography_keys. is_empty ( ) {
246- Ok ( "" . to_string ( ) )
262+ String :: new ( )
247263 } else {
248- Ok ( format ! (
249- "import \" {}\" ;declare module \" {}\" {{interface {} {{{}}}interface {} {{{}}}}}" ,
264+ format ! (
265+ "import \" {}\" ;declare module \" {}\" {{interface {}{{{}}}interface {}{{{}}}interface {} {{{}}}}}" ,
250266 package_name,
251267 package_name,
252268 color_interface_name,
@@ -260,7 +276,83 @@ pub fn get_theme_interface(
260276 . into_iter( )
261277 . map( |key| format!( "{}:null;" , key) )
262278 . collect:: <Vec <String >>( )
279+ . join( "" ) ,
280+ theme_interface_name,
281+ theme_keys
282+ . into_iter( )
283+ // key to pascal
284+ . map( |key| format!( "{}:null;" , key) )
285+ . collect:: <Vec <String >>( )
263286 . join( "" )
264- ) )
287+ )
288+ }
289+ }
290+ #[ cfg( test) ]
291+ mod tests {
292+ use super :: * ;
293+ use serial_test:: serial;
294+
295+ #[ test]
296+ #[ serial]
297+ fn test_code_extract ( ) {
298+ {
299+ let mut sheet = GLOBAL_STYLE_SHEET . lock ( ) . unwrap ( ) ;
300+ * sheet = StyleSheet :: default ( ) ;
301+ }
302+ assert_eq ! ( get_css( ) . unwrap( ) , "" ) ;
303+
304+ {
305+ let mut sheet = GLOBAL_STYLE_SHEET . lock ( ) . unwrap ( ) ;
306+ let mut theme = Theme :: default ( ) ;
307+ let mut color_theme = ColorTheme :: default ( ) ;
308+ color_theme. add_color ( "primary" , "#000" ) ;
309+ theme. colors . add_theme ( "dark" , color_theme) ;
310+
311+ let mut color_theme = ColorTheme :: default ( ) ;
312+ color_theme. add_color ( "primary" , "#FFF" ) ;
313+ theme. colors . add_theme ( "default" , color_theme) ;
314+ sheet. set_theme ( theme) ;
315+ }
316+
317+ assert_eq ! (
318+ get_css( ) . unwrap( ) ,
319+ ":root{--primary:#FFF;}\n :root[data-theme=dark]{--primary:#000;}\n "
320+ ) ;
321+ }
322+
323+ #[ test]
324+ #[ serial]
325+ fn test_get_theme_interface ( ) {
326+ {
327+ let mut sheet = GLOBAL_STYLE_SHEET . lock ( ) . unwrap ( ) ;
328+ * sheet = StyleSheet :: default ( ) ;
329+ }
330+ assert_eq ! (
331+ get_theme_interface(
332+ "package" ,
333+ "ColorInterface" ,
334+ "TypographyInterface" ,
335+ "ThemeInterface"
336+ ) ,
337+ ""
338+ ) ;
339+
340+ {
341+ let mut sheet = GLOBAL_STYLE_SHEET . lock ( ) . unwrap ( ) ;
342+ let mut theme = Theme :: default ( ) ;
343+ let mut color_theme = ColorTheme :: default ( ) ;
344+ color_theme. add_color ( "primary" , "#000" ) ;
345+ theme. colors . add_theme ( "dark" , color_theme) ;
346+ sheet. set_theme ( theme) ;
347+ }
348+ assert_eq ! (
349+ get_theme_interface(
350+ "package" ,
351+ "ColorInterface" ,
352+ "TypographyInterface" ,
353+ "ThemeInterface"
354+ ) ,
355+ "import \" package\" ;declare module \" package\" {interface ColorInterface{$primary:null;}interface TypographyInterface{}interface ThemeInterface{dark:null;}}"
356+ ) ;
265357 }
266358}
0 commit comments