@@ -102,11 +102,16 @@ where
102
102
#[ derive( PartialEq , Debug , Clone ) ]
103
103
enum LinkType < ' a > {
104
104
Escaped ,
105
- IncludeRange ( PathBuf , LineRange ) ,
106
- IncludeAnchor ( PathBuf , String ) ,
105
+ Include ( PathBuf , RangeOrAnchor ) ,
107
106
Playpen ( PathBuf , Vec < & ' a str > ) ,
108
107
}
109
108
109
+ #[ derive( PartialEq , Debug , Clone ) ]
110
+ enum RangeOrAnchor {
111
+ Range ( LineRange ) ,
112
+ Anchor ( String ) ,
113
+ }
114
+
110
115
// A range of lines specified with some include directive.
111
116
#[ derive( PartialEq , Debug , Clone ) ]
112
117
enum LineRange {
@@ -165,8 +170,7 @@ impl<'a> LinkType<'a> {
165
170
let base = base. as_ref ( ) ;
166
171
match self {
167
172
LinkType :: Escaped => None ,
168
- LinkType :: IncludeRange ( p, _) => Some ( return_relative_path ( base, & p) ) ,
169
- LinkType :: IncludeAnchor ( p, _) => Some ( return_relative_path ( base, & p) ) ,
173
+ LinkType :: Include ( p, _) => Some ( return_relative_path ( base, & p) ) ,
170
174
LinkType :: Playpen ( p, _) => Some ( return_relative_path ( base, & p) ) ,
171
175
}
172
176
}
@@ -179,9 +183,8 @@ fn return_relative_path<P: AsRef<Path>>(base: P, relative: P) -> PathBuf {
179
183
. to_path_buf ( )
180
184
}
181
185
182
- fn parse_include_path ( path : & str ) -> LinkType < ' static > {
183
- let mut parts = path. splitn ( 4 , ':' ) . fuse ( ) ;
184
- let path = parts. next ( ) . unwrap ( ) . into ( ) ;
186
+ fn parse_range_or_anchor ( parts : Option < & str > ) -> RangeOrAnchor {
187
+ let mut parts = parts. unwrap_or ( "" ) . splitn ( 3 , ':' ) . fuse ( ) ;
185
188
186
189
let next_element = parts. next ( ) ;
187
190
let start = if let Some ( value) = next_element. and_then ( |s| s. parse :: < usize > ( ) . ok ( ) ) {
@@ -190,7 +193,7 @@ fn parse_include_path(path: &str) -> LinkType<'static> {
190
193
} else if let Some ( "" ) = next_element {
191
194
None
192
195
} else if let Some ( anchor) = next_element {
193
- return LinkType :: IncludeAnchor ( path , String :: from ( anchor) ) ;
196
+ return RangeOrAnchor :: Anchor ( String :: from ( anchor) ) ;
194
197
} else {
195
198
None
196
199
} ;
@@ -202,16 +205,23 @@ fn parse_include_path(path: &str) -> LinkType<'static> {
202
205
let end = end. map ( |s| s. parse :: < usize > ( ) ) ;
203
206
204
207
match ( start, end) {
205
- ( Some ( start) , Some ( Ok ( end) ) ) => LinkType :: IncludeRange ( path, LineRange :: from ( start..end) ) ,
206
- ( Some ( start) , Some ( Err ( _) ) ) => LinkType :: IncludeRange ( path, LineRange :: from ( start..) ) ,
207
- ( Some ( start) , None ) => LinkType :: IncludeRange ( path, LineRange :: from ( start..start + 1 ) ) ,
208
- ( None , Some ( Ok ( end) ) ) => LinkType :: IncludeRange ( path, LineRange :: from ( ..end) ) ,
209
- ( None , None ) | ( None , Some ( Err ( _) ) ) => {
210
- LinkType :: IncludeRange ( path, LineRange :: from ( RangeFull ) )
211
- }
208
+ ( Some ( start) , Some ( Ok ( end) ) ) => RangeOrAnchor :: Range ( LineRange :: from ( start..end) ) ,
209
+ ( Some ( start) , Some ( Err ( _) ) ) => RangeOrAnchor :: Range ( LineRange :: from ( start..) ) ,
210
+ ( Some ( start) , None ) => RangeOrAnchor :: Range ( LineRange :: from ( start..start + 1 ) ) ,
211
+ ( None , Some ( Ok ( end) ) ) => RangeOrAnchor :: Range ( LineRange :: from ( ..end) ) ,
212
+ ( None , None ) | ( None , Some ( Err ( _) ) ) => RangeOrAnchor :: Range ( LineRange :: from ( RangeFull ) ) ,
212
213
}
213
214
}
214
215
216
+ fn parse_include_path ( path : & str ) -> LinkType < ' static > {
217
+ let mut parts = path. splitn ( 2 , ':' ) ;
218
+
219
+ let path = parts. next ( ) . unwrap ( ) . into ( ) ;
220
+ let range_or_anchor = parse_range_or_anchor ( parts. next ( ) ) ;
221
+
222
+ LinkType :: Include ( path, range_or_anchor)
223
+ }
224
+
215
225
#[ derive( PartialEq , Debug , Clone ) ]
216
226
struct Link < ' a > {
217
227
start_index : usize ,
@@ -255,24 +265,14 @@ impl<'a> Link<'a> {
255
265
match self . link_type {
256
266
// omit the escape char
257
267
LinkType :: Escaped => Ok ( ( & self . link_text [ 1 ..] ) . to_owned ( ) ) ,
258
- LinkType :: IncludeRange ( ref pat, ref range ) => {
268
+ LinkType :: Include ( ref pat, ref range_or_anchor ) => {
259
269
let target = base. join ( pat) ;
260
270
261
271
fs:: read_to_string ( & target)
262
- . map ( |s| take_lines ( & s, range. clone ( ) ) )
263
- . chain_err ( || {
264
- format ! (
265
- "Could not read file for link {} ({})" ,
266
- self . link_text,
267
- target. display( ) ,
268
- )
272
+ . map ( |s| match range_or_anchor {
273
+ RangeOrAnchor :: Range ( range) => take_lines ( & s, range. clone ( ) ) ,
274
+ RangeOrAnchor :: Anchor ( anchor) => take_anchored_lines ( & s, anchor) ,
269
275
} )
270
- }
271
- LinkType :: IncludeAnchor ( ref pat, ref anchor) => {
272
- let target = base. join ( pat) ;
273
-
274
- fs:: read_to_string ( & target)
275
- . map ( |s| take_anchored_lines ( & s, anchor) )
276
276
. chain_err ( || {
277
277
format ! (
278
278
"Could not read file for link {} ({})" ,
@@ -419,7 +419,10 @@ mod tests {
419
419
vec![ Link {
420
420
start_index: 22 ,
421
421
end_index: 48 ,
422
- link_type: LinkType :: IncludeRange ( PathBuf :: from( "file.rs" ) , LineRange :: from( 9 ..20 ) ) ,
422
+ link_type: LinkType :: Include (
423
+ PathBuf :: from( "file.rs" ) ,
424
+ RangeOrAnchor :: Range ( LineRange :: from( 9 ..20 ) )
425
+ ) ,
423
426
link_text: "{{#include file.rs:10:20}}" ,
424
427
} ]
425
428
) ;
@@ -435,7 +438,10 @@ mod tests {
435
438
vec![ Link {
436
439
start_index: 22 ,
437
440
end_index: 45 ,
438
- link_type: LinkType :: IncludeRange ( PathBuf :: from( "file.rs" ) , LineRange :: from( 9 ..10 ) ) ,
441
+ link_type: LinkType :: Include (
442
+ PathBuf :: from( "file.rs" ) ,
443
+ RangeOrAnchor :: Range ( LineRange :: from( 9 ..10 ) )
444
+ ) ,
439
445
link_text: "{{#include file.rs:10}}" ,
440
446
} ]
441
447
) ;
@@ -451,7 +457,10 @@ mod tests {
451
457
vec![ Link {
452
458
start_index: 22 ,
453
459
end_index: 46 ,
454
- link_type: LinkType :: IncludeRange ( PathBuf :: from( "file.rs" ) , LineRange :: from( 9 ..) ) ,
460
+ link_type: LinkType :: Include (
461
+ PathBuf :: from( "file.rs" ) ,
462
+ RangeOrAnchor :: Range ( LineRange :: from( 9 ..) )
463
+ ) ,
455
464
link_text: "{{#include file.rs:10:}}" ,
456
465
} ]
457
466
) ;
@@ -467,7 +476,10 @@ mod tests {
467
476
vec![ Link {
468
477
start_index: 22 ,
469
478
end_index: 46 ,
470
- link_type: LinkType :: IncludeRange ( PathBuf :: from( "file.rs" ) , LineRange :: from( ..20 ) ) ,
479
+ link_type: LinkType :: Include (
480
+ PathBuf :: from( "file.rs" ) ,
481
+ RangeOrAnchor :: Range ( LineRange :: from( ..20 ) )
482
+ ) ,
471
483
link_text: "{{#include file.rs::20}}" ,
472
484
} ]
473
485
) ;
@@ -483,7 +495,10 @@ mod tests {
483
495
vec![ Link {
484
496
start_index: 22 ,
485
497
end_index: 44 ,
486
- link_type: LinkType :: IncludeRange ( PathBuf :: from( "file.rs" ) , LineRange :: from( ..) ) ,
498
+ link_type: LinkType :: Include (
499
+ PathBuf :: from( "file.rs" ) ,
500
+ RangeOrAnchor :: Range ( LineRange :: from( ..) )
501
+ ) ,
487
502
link_text: "{{#include file.rs::}}" ,
488
503
} ]
489
504
) ;
@@ -499,7 +514,10 @@ mod tests {
499
514
vec![ Link {
500
515
start_index: 22 ,
501
516
end_index: 42 ,
502
- link_type: LinkType :: IncludeRange ( PathBuf :: from( "file.rs" ) , LineRange :: from( ..) ) ,
517
+ link_type: LinkType :: Include (
518
+ PathBuf :: from( "file.rs" ) ,
519
+ RangeOrAnchor :: Range ( LineRange :: from( ..) )
520
+ ) ,
503
521
link_text: "{{#include file.rs}}" ,
504
522
} ]
505
523
) ;
@@ -515,9 +533,9 @@ mod tests {
515
533
vec![ Link {
516
534
start_index: 22 ,
517
535
end_index: 49 ,
518
- link_type: LinkType :: IncludeAnchor (
536
+ link_type: LinkType :: Include (
519
537
PathBuf :: from( "file.rs" ) ,
520
- String :: from( "anchor" )
538
+ RangeOrAnchor :: Anchor ( String :: from( "anchor" ) )
521
539
) ,
522
540
link_text: "{{#include file.rs:anchor}}" ,
523
541
} ]
@@ -585,7 +603,10 @@ mod tests {
585
603
Link {
586
604
start_index: 38 ,
587
605
end_index: 58 ,
588
- link_type: LinkType :: IncludeRange ( PathBuf :: from( "file.rs" ) , LineRange :: from( ..) ) ,
606
+ link_type: LinkType :: Include (
607
+ PathBuf :: from( "file.rs" ) ,
608
+ RangeOrAnchor :: Range ( LineRange :: from( ..) )
609
+ ) ,
589
610
link_text: "{{#include file.rs}}" ,
590
611
}
591
612
) ;
@@ -617,7 +638,10 @@ mod tests {
617
638
let link_type = parse_include_path ( "arbitrary" ) ;
618
639
assert_eq ! (
619
640
link_type,
620
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( RangeFull ) )
641
+ LinkType :: Include (
642
+ PathBuf :: from( "arbitrary" ) ,
643
+ RangeOrAnchor :: Range ( LineRange :: from( RangeFull ) )
644
+ )
621
645
) ;
622
646
}
623
647
@@ -626,7 +650,10 @@ mod tests {
626
650
let link_type = parse_include_path ( "arbitrary:" ) ;
627
651
assert_eq ! (
628
652
link_type,
629
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( RangeFull ) )
653
+ LinkType :: Include (
654
+ PathBuf :: from( "arbitrary" ) ,
655
+ RangeOrAnchor :: Range ( LineRange :: from( RangeFull ) )
656
+ )
630
657
) ;
631
658
}
632
659
@@ -635,7 +662,10 @@ mod tests {
635
662
let link_type = parse_include_path ( "arbitrary::" ) ;
636
663
assert_eq ! (
637
664
link_type,
638
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( RangeFull ) )
665
+ LinkType :: Include (
666
+ PathBuf :: from( "arbitrary" ) ,
667
+ RangeOrAnchor :: Range ( LineRange :: from( RangeFull ) )
668
+ )
639
669
) ;
640
670
}
641
671
@@ -644,7 +674,10 @@ mod tests {
644
674
let link_type = parse_include_path ( "arbitrary::NaN" ) ;
645
675
assert_eq ! (
646
676
link_type,
647
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( RangeFull ) )
677
+ LinkType :: Include (
678
+ PathBuf :: from( "arbitrary" ) ,
679
+ RangeOrAnchor :: Range ( LineRange :: from( RangeFull ) )
680
+ )
648
681
) ;
649
682
}
650
683
@@ -653,7 +686,10 @@ mod tests {
653
686
let link_type = parse_include_path ( "arbitrary:5" ) ;
654
687
assert_eq ! (
655
688
link_type,
656
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( 4 ..5 ) )
689
+ LinkType :: Include (
690
+ PathBuf :: from( "arbitrary" ) ,
691
+ RangeOrAnchor :: Range ( LineRange :: from( 4 ..5 ) )
692
+ )
657
693
) ;
658
694
}
659
695
@@ -662,7 +698,10 @@ mod tests {
662
698
let link_type = parse_include_path ( "arbitrary:1" ) ;
663
699
assert_eq ! (
664
700
link_type,
665
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( 0 ..1 ) )
701
+ LinkType :: Include (
702
+ PathBuf :: from( "arbitrary" ) ,
703
+ RangeOrAnchor :: Range ( LineRange :: from( 0 ..1 ) )
704
+ )
666
705
) ;
667
706
}
668
707
@@ -671,7 +710,10 @@ mod tests {
671
710
let link_type = parse_include_path ( "arbitrary:0" ) ;
672
711
assert_eq ! (
673
712
link_type,
674
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( 0 ..1 ) )
713
+ LinkType :: Include (
714
+ PathBuf :: from( "arbitrary" ) ,
715
+ RangeOrAnchor :: Range ( LineRange :: from( 0 ..1 ) )
716
+ )
675
717
) ;
676
718
}
677
719
@@ -680,7 +722,10 @@ mod tests {
680
722
let link_type = parse_include_path ( "arbitrary:5:" ) ;
681
723
assert_eq ! (
682
724
link_type,
683
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( 4 ..) )
725
+ LinkType :: Include (
726
+ PathBuf :: from( "arbitrary" ) ,
727
+ RangeOrAnchor :: Range ( LineRange :: from( 4 ..) )
728
+ )
684
729
) ;
685
730
}
686
731
@@ -689,7 +734,10 @@ mod tests {
689
734
let link_type = parse_include_path ( "arbitrary:5:NaN" ) ;
690
735
assert_eq ! (
691
736
link_type,
692
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( 4 ..) )
737
+ LinkType :: Include (
738
+ PathBuf :: from( "arbitrary" ) ,
739
+ RangeOrAnchor :: Range ( LineRange :: from( 4 ..) )
740
+ )
693
741
) ;
694
742
}
695
743
@@ -698,7 +746,10 @@ mod tests {
698
746
let link_type = parse_include_path ( "arbitrary::5" ) ;
699
747
assert_eq ! (
700
748
link_type,
701
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( ..5 ) )
749
+ LinkType :: Include (
750
+ PathBuf :: from( "arbitrary" ) ,
751
+ RangeOrAnchor :: Range ( LineRange :: from( ..5 ) )
752
+ )
702
753
) ;
703
754
}
704
755
@@ -707,7 +758,10 @@ mod tests {
707
758
let link_type = parse_include_path ( "arbitrary:5:10" ) ;
708
759
assert_eq ! (
709
760
link_type,
710
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( 4 ..10 ) )
761
+ LinkType :: Include (
762
+ PathBuf :: from( "arbitrary" ) ,
763
+ RangeOrAnchor :: Range ( LineRange :: from( 4 ..10 ) )
764
+ )
711
765
) ;
712
766
}
713
767
@@ -716,7 +770,10 @@ mod tests {
716
770
let link_type = parse_include_path ( "arbitrary:-5" ) ;
717
771
assert_eq ! (
718
772
link_type,
719
- LinkType :: IncludeAnchor ( PathBuf :: from( "arbitrary" ) , "-5" . to_string( ) )
773
+ LinkType :: Include (
774
+ PathBuf :: from( "arbitrary" ) ,
775
+ RangeOrAnchor :: Anchor ( "-5" . to_string( ) )
776
+ )
720
777
) ;
721
778
}
722
779
@@ -725,7 +782,10 @@ mod tests {
725
782
let link_type = parse_include_path ( "arbitrary:-5.7" ) ;
726
783
assert_eq ! (
727
784
link_type,
728
- LinkType :: IncludeAnchor ( PathBuf :: from( "arbitrary" ) , "-5.7" . to_string( ) )
785
+ LinkType :: Include (
786
+ PathBuf :: from( "arbitrary" ) ,
787
+ RangeOrAnchor :: Anchor ( "-5.7" . to_string( ) )
788
+ )
729
789
) ;
730
790
}
731
791
@@ -734,7 +794,10 @@ mod tests {
734
794
let link_type = parse_include_path ( "arbitrary:some-anchor:this-gets-ignored" ) ;
735
795
assert_eq ! (
736
796
link_type,
737
- LinkType :: IncludeAnchor ( PathBuf :: from( "arbitrary" ) , "some-anchor" . to_string( ) )
797
+ LinkType :: Include (
798
+ PathBuf :: from( "arbitrary" ) ,
799
+ RangeOrAnchor :: Anchor ( "some-anchor" . to_string( ) )
800
+ )
738
801
) ;
739
802
}
740
803
@@ -743,7 +806,10 @@ mod tests {
743
806
let link_type = parse_include_path ( "arbitrary:5:10:17:anything:" ) ;
744
807
assert_eq ! (
745
808
link_type,
746
- LinkType :: IncludeRange ( PathBuf :: from( "arbitrary" ) , LineRange :: from( 4 ..10 ) )
809
+ LinkType :: Include (
810
+ PathBuf :: from( "arbitrary" ) ,
811
+ RangeOrAnchor :: Range ( LineRange :: from( 4 ..10 ) )
812
+ )
747
813
) ;
748
814
}
749
815
}
0 commit comments