@@ -17,7 +17,7 @@ use alloc::{
17
17
sync:: Arc ,
18
18
vec:: Vec ,
19
19
} ;
20
- use core:: iter:: FusedIterator ;
20
+ use core:: { fmt , iter:: FusedIterator } ;
21
21
22
22
use crate :: filters:: FilterResult ;
23
23
use crate :: iterators:: {
@@ -501,20 +501,37 @@ impl<'a> Node<'a> {
501
501
}
502
502
503
503
pub fn label ( & self ) -> Option < String > {
504
+ let mut result = String :: new ( ) ;
505
+ self . write_label ( & mut result) . unwrap ( ) . then_some ( result)
506
+ }
507
+
508
+ fn write_label_direct < W : fmt:: Write > ( & self , mut writer : W ) -> Result < bool , fmt:: Error > {
504
509
if let Some ( label) = & self . data ( ) . label ( ) {
505
- Some ( label. to_string ( ) )
510
+ writer. write_str ( label) ?;
511
+ Ok ( true )
512
+ } else {
513
+ Ok ( false )
514
+ }
515
+ }
516
+
517
+ pub fn write_label < W : fmt:: Write > ( & self , mut writer : W ) -> Result < bool , fmt:: Error > {
518
+ if self . write_label_direct ( & mut writer) ? {
519
+ Ok ( true )
506
520
} else {
507
- let labels = self
508
- . labelled_by ( )
509
- . filter_map ( |node| {
510
- if node. label_comes_from_value ( ) {
511
- node. value ( )
512
- } else {
513
- node. label ( )
514
- }
515
- } )
516
- . collect :: < Vec < String > > ( ) ;
517
- ( !labels. is_empty ( ) ) . then ( move || labels. join ( " " ) )
521
+ let mut wrote_one = false ;
522
+ for node in self . labelled_by ( ) {
523
+ let writer = SpacePrefixingWriter {
524
+ inner : & mut writer,
525
+ need_prefix : wrote_one,
526
+ } ;
527
+ let wrote_this_time = if node. label_comes_from_value ( ) {
528
+ node. write_value ( writer)
529
+ } else {
530
+ node. write_label_direct ( writer)
531
+ } ?;
532
+ wrote_one = wrote_one || wrote_this_time;
533
+ }
534
+ Ok ( wrote_one)
518
535
}
519
536
}
520
537
@@ -529,12 +546,19 @@ impl<'a> Node<'a> {
529
546
}
530
547
531
548
pub fn value ( & self ) -> Option < String > {
549
+ let mut result = String :: new ( ) ;
550
+ self . write_value ( & mut result) . unwrap ( ) . then_some ( result)
551
+ }
552
+
553
+ pub fn write_value < W : fmt:: Write > ( & self , mut writer : W ) -> Result < bool , fmt:: Error > {
532
554
if let Some ( value) = & self . data ( ) . value ( ) {
533
- Some ( value. to_string ( ) )
555
+ writer. write_str ( value) ?;
556
+ Ok ( true )
534
557
} else if self . supports_text_ranges ( ) && !self . is_multiline ( ) {
535
- Some ( self . document_range ( ) . text ( ) )
558
+ self . document_range ( ) . write_text ( writer) ?;
559
+ Ok ( true )
536
560
} else {
537
- None
561
+ Ok ( false )
538
562
}
539
563
}
540
564
@@ -664,6 +688,33 @@ impl<'a> Node<'a> {
664
688
}
665
689
}
666
690
691
+ struct SpacePrefixingWriter < W : fmt:: Write > {
692
+ inner : W ,
693
+ need_prefix : bool ,
694
+ }
695
+
696
+ impl < W : fmt:: Write > SpacePrefixingWriter < W > {
697
+ fn write_prefix_if_needed ( & mut self ) -> fmt:: Result {
698
+ if self . need_prefix {
699
+ self . inner . write_char ( ' ' ) ?;
700
+ self . need_prefix = false ;
701
+ }
702
+ Ok ( ( ) )
703
+ }
704
+ }
705
+
706
+ impl < W : fmt:: Write > fmt:: Write for SpacePrefixingWriter < W > {
707
+ fn write_str ( & mut self , s : & str ) -> fmt:: Result {
708
+ self . write_prefix_if_needed ( ) ?;
709
+ self . inner . write_str ( s)
710
+ }
711
+
712
+ fn write_char ( & mut self , c : char ) -> fmt:: Result {
713
+ self . write_prefix_if_needed ( ) ?;
714
+ self . inner . write_char ( c)
715
+ }
716
+ }
717
+
667
718
#[ cfg( test) ]
668
719
mod tests {
669
720
use accesskit:: { Node , NodeId , Point , Rect , Role , Tree , TreeUpdate } ;
0 commit comments