@@ -10,23 +10,27 @@ use crate::common::{AnyId, EdgeId, NodeId, TagId};
10
10
pub use self :: {
11
11
any_id_or_defaults:: AnyIdOrDefaults , color_params:: ColorParams ,
12
12
css_class_merger:: CssClassMerger , css_class_partials:: CssClassPartials ,
13
- css_classes:: CssClasses , css_classes_builder:: CssClassesBuilder , el_css_classes:: ElCssClasses ,
13
+ css_classes:: CssClasses , css_classes_and_warnings:: CssClassesAndWarnings ,
14
+ css_classes_builder:: CssClassesBuilder , el_css_classes:: ElCssClasses ,
14
15
highlight_state:: HighlightState , stroke_params:: StrokeParams , style_for:: StyleFor ,
15
- theme_attr:: ThemeAttr , theme_styles:: ThemeStyles , themeable:: Themeable ,
16
+ theme_attr:: ThemeAttr , theme_styles:: ThemeStyles , theme_warnings:: ThemeWarnings ,
17
+ themeable:: Themeable ,
16
18
} ;
17
19
18
20
mod any_id_or_defaults;
19
21
mod color_params;
20
22
mod css_class_merger;
21
23
mod css_class_partials;
22
24
mod css_classes;
25
+ mod css_classes_and_warnings;
23
26
mod css_classes_builder;
24
27
mod el_css_classes;
25
28
mod highlight_state;
26
29
mod stroke_params;
27
30
mod style_for;
28
31
mod theme_attr;
29
32
mod theme_styles;
33
+ mod theme_warnings;
30
34
mod themeable;
31
35
32
36
/// Theme to style the generated diagram.
@@ -227,7 +231,7 @@ impl Theme {
227
231
///
228
232
/// The [`CssClasses`] produced will contain an entry for each node / edge
229
233
/// ID from the themeable type.
230
- pub fn el_css_classes < T > ( & self , themeable : & T ) -> ElCssClasses
234
+ pub fn el_css_classes < T > ( & self , themeable : & T ) -> ( ElCssClasses , ThemeWarnings )
231
235
where
232
236
T : Themeable ,
233
237
{
@@ -240,13 +244,32 @@ impl Theme {
240
244
theme
241
245
. node_el_css_classes ( themeable)
242
246
. chain ( theme. edge_el_css_classes ( themeable) )
243
- . collect ( )
247
+ . fold (
248
+ (
249
+ ElCssClasses :: with_capacity (
250
+ themeable. node_ids ( ) . count ( ) + themeable. edge_ids ( ) . count ( ) ,
251
+ ) ,
252
+ ThemeWarnings :: new ( ) ,
253
+ ) ,
254
+ |( mut el_css_classes, mut theme_warnings_acc) ,
255
+ ( any_id, css_classes_and_warnings) | {
256
+ let CssClassesAndWarnings {
257
+ css_classes,
258
+ theme_warnings,
259
+ } = css_classes_and_warnings;
260
+
261
+ el_css_classes. insert ( any_id, css_classes) ;
262
+ theme_warnings_acc. extend ( theme_warnings. into_inner ( ) ) ;
263
+
264
+ ( el_css_classes, theme_warnings_acc)
265
+ } ,
266
+ )
244
267
}
245
268
246
269
fn node_el_css_classes < ' f , T > (
247
270
& ' f self ,
248
271
themeable : & ' f T ,
249
- ) -> impl Iterator < Item = ( AnyId , CssClasses ) > + ' f
272
+ ) -> impl Iterator < Item = ( AnyId , CssClassesAndWarnings ) > + ' f
250
273
where
251
274
T : Themeable ,
252
275
{
@@ -255,13 +278,13 @@ impl Theme {
255
278
let node_class_partials_specified = self . node_class_partials_specified ( node_id) ;
256
279
257
280
let any_id = Some ( AnyId :: from ( node_id. clone ( ) ) ) ;
258
- let node_classes = CssClassMerger :: node_classes (
281
+ let node_classes_and_warnings = CssClassMerger :: node_classes (
259
282
node_class_partials_defaults,
260
283
node_class_partials_specified,
261
284
themeable,
262
285
) ;
263
286
264
- any_id. map ( |any_id| ( any_id, node_classes ) )
287
+ any_id. map ( |any_id| ( any_id, node_classes_and_warnings ) )
265
288
} )
266
289
}
267
290
@@ -278,7 +301,7 @@ impl Theme {
278
301
fn edge_el_css_classes < ' f , T > (
279
302
& ' f self ,
280
303
themeable : & ' f T ,
281
- ) -> impl Iterator < Item = ( AnyId , CssClasses ) > + ' f
304
+ ) -> impl Iterator < Item = ( AnyId , CssClassesAndWarnings ) > + ' f
282
305
where
283
306
T : Themeable ,
284
307
{
@@ -288,13 +311,13 @@ impl Theme {
288
311
let edge_class_partials_specified = self . edge_class_partials_specified ( edge_id) ;
289
312
290
313
let any_id = Some ( AnyId :: from ( edge_id. clone ( ) ) ) ;
291
- let edge_classes = CssClassMerger :: edge_classes (
314
+ let edge_classes_and_warnings = CssClassMerger :: edge_classes (
292
315
edge_class_partials_defaults,
293
316
edge_class_partials_specified,
294
317
themeable,
295
318
) ;
296
319
297
- any_id. map ( |any_id| ( any_id, edge_classes ) )
320
+ any_id. map ( |any_id| ( any_id, edge_classes_and_warnings ) )
298
321
} )
299
322
}
300
323
@@ -314,7 +337,7 @@ impl Theme {
314
337
themeable : & T ,
315
338
diagram_theme : & Theme ,
316
339
tag_id : & TagId ,
317
- ) -> ElCssClasses
340
+ ) -> ( ElCssClasses , ThemeWarnings )
318
341
where
319
342
T : Themeable ,
320
343
{
@@ -339,14 +362,33 @@ impl Theme {
339
362
tag_theme
340
363
. node_tag_el_css_classes ( themeable, tag_id)
341
364
. chain ( tag_theme. edge_tag_el_css_classes ( themeable, tag_id) )
342
- . collect ( )
365
+ . fold (
366
+ (
367
+ ElCssClasses :: with_capacity (
368
+ themeable. node_ids ( ) . count ( ) + themeable. edge_ids ( ) . count ( ) ,
369
+ ) ,
370
+ ThemeWarnings :: new ( ) ,
371
+ ) ,
372
+ |( mut el_css_classes, mut theme_warnings_acc) ,
373
+ ( any_id, css_classes_and_warnings) | {
374
+ let CssClassesAndWarnings {
375
+ css_classes,
376
+ theme_warnings,
377
+ } = css_classes_and_warnings;
378
+
379
+ el_css_classes. insert ( any_id, css_classes) ;
380
+ theme_warnings_acc. extend ( theme_warnings. into_inner ( ) ) ;
381
+
382
+ ( el_css_classes, theme_warnings_acc)
383
+ } ,
384
+ )
343
385
}
344
386
345
387
fn node_tag_el_css_classes < ' f , T > (
346
388
& ' f self ,
347
389
themeable : & ' f T ,
348
390
tag_id : & ' f TagId ,
349
- ) -> impl Iterator < Item = ( AnyId , CssClasses ) > + ' f
391
+ ) -> impl Iterator < Item = ( AnyId , CssClassesAndWarnings ) > + ' f
350
392
where
351
393
T : Themeable ,
352
394
{
@@ -355,22 +397,22 @@ impl Theme {
355
397
let node_class_partials_specified = self . node_class_partials_specified ( node_id) ;
356
398
357
399
let any_id = Some ( AnyId :: from ( node_id. clone ( ) ) ) ;
358
- let node_classes = CssClassMerger :: node_tag_classes (
400
+ let node_classes_and_warnings = CssClassMerger :: node_tag_classes (
359
401
node_class_partials_defaults,
360
402
node_class_partials_specified,
361
403
themeable,
362
404
tag_id,
363
405
) ;
364
406
365
- any_id. map ( |any_id| ( any_id, node_classes ) )
407
+ any_id. map ( |any_id| ( any_id, node_classes_and_warnings ) )
366
408
} )
367
409
}
368
410
369
411
fn edge_tag_el_css_classes < ' f , T > (
370
412
& ' f self ,
371
413
themeable : & ' f T ,
372
414
tag_id : & ' f TagId ,
373
- ) -> impl Iterator < Item = ( AnyId , CssClasses ) > + ' f
415
+ ) -> impl Iterator < Item = ( AnyId , CssClassesAndWarnings ) > + ' f
374
416
where
375
417
T : Themeable ,
376
418
{
@@ -380,14 +422,14 @@ impl Theme {
380
422
let edge_class_partials_specified = self . edge_class_partials_specified ( edge_id) ;
381
423
382
424
let any_id = Some ( AnyId :: from ( edge_id. clone ( ) ) ) ;
383
- let edge_classes = CssClassMerger :: edge_tag_classes (
425
+ let edge_classes_and_warnings = CssClassMerger :: edge_tag_classes (
384
426
edge_class_partials_defaults,
385
427
edge_class_partials_specified,
386
428
themeable,
387
429
tag_id,
388
430
) ;
389
431
390
- any_id. map ( |any_id| ( any_id, edge_classes ) )
432
+ any_id. map ( |any_id| ( any_id, edge_classes_and_warnings ) )
391
433
} )
392
434
}
393
435
}
0 commit comments