1
- use crate :: { font:: FontCollection , Registry , Status , StatusList , Testable } ;
1
+ use crate :: {
2
+ font:: FontCollection , prelude:: FixFnResult , status:: CheckFnResult , Registry , Status , Testable ,
3
+ } ;
2
4
3
5
pub type CheckId = String ;
4
6
@@ -8,10 +10,10 @@ pub struct Check<'a> {
8
10
pub title : & ' a str ,
9
11
pub rationale : Option < & ' a str > ,
10
12
pub proposal : Option < & ' a str > ,
11
- pub check_one : Option < & ' a dyn Fn ( & Testable ) -> StatusList > ,
12
- pub check_all : Option < & ' a dyn Fn ( & FontCollection ) -> StatusList > ,
13
- pub hotfix : Option < & ' a dyn Fn ( & Testable ) -> bool > ,
14
- pub fix_source : Option < & ' a dyn Fn ( & Testable ) -> bool > ,
13
+ pub check_one : Option < & ' a dyn Fn ( & Testable ) -> CheckFnResult > ,
14
+ pub check_all : Option < & ' a dyn Fn ( & FontCollection ) -> CheckFnResult > ,
15
+ pub hotfix : Option < & ' a dyn Fn ( & Testable ) -> FixFnResult > ,
16
+ pub fix_source : Option < & ' a dyn Fn ( & Testable ) -> FixFnResult > ,
15
17
pub applies_to : & ' a str ,
16
18
}
17
19
@@ -34,42 +36,47 @@ impl<'a> Check<'a> {
34
36
. map_or ( false , |ft| ft. applies ( f) )
35
37
}
36
38
39
+ fn status_to_result ( & ' a self , status : Status , file : Option < & ' a Testable > ) -> CheckResult {
40
+ CheckResult {
41
+ status,
42
+ check_id : self . id . to_string ( ) ,
43
+ check_name : self . title . to_string ( ) ,
44
+ check_rationale : self . rationale . map ( |x| x. to_string ( ) ) ,
45
+ filename : file. map ( |x| x. filename . clone ( ) ) ,
46
+ }
47
+ }
48
+
37
49
pub fn run_one ( & ' a self , f : & ' a Testable ) -> Vec < CheckResult > {
38
50
if let Some ( check_one) = self . check_one {
39
- return check_one ( f)
40
- . map ( |r| CheckResult {
41
- status : r,
42
- check_id : self . id . to_string ( ) ,
43
- check_name : self . title . to_string ( ) ,
44
- check_rationale : self . rationale . map ( |x| x. to_string ( ) ) ,
45
- filename : Some ( f. filename . clone ( ) ) ,
46
- } )
47
- . collect ( ) ;
51
+ match check_one ( f) {
52
+ Ok ( results) => results. map ( |r| self . status_to_result ( r, Some ( f) ) ) . collect ( ) ,
53
+ Err ( e) => {
54
+ vec ! [ self . status_to_result( Status :: error( & format!( "Error: {}" , e) ) , Some ( f) ) ]
55
+ }
56
+ }
57
+ } else {
58
+ vec ! [ ]
48
59
}
49
- vec ! [ ]
50
60
}
51
61
52
62
pub fn run_all ( & ' a self , f : & ' a FontCollection ) -> Vec < CheckResult > {
53
63
if let Some ( check_all) = self . check_all {
54
- check_all ( f)
55
- . map ( |r| CheckResult {
56
- status : r,
57
- check_id : self . id . to_string ( ) ,
58
- check_name : self . title . to_string ( ) ,
59
- check_rationale : self . rationale . map ( |x| x. to_string ( ) ) ,
60
- filename : None ,
61
- } )
62
- . collect ( )
64
+ match check_all ( f) {
65
+ Ok ( results) => results. map ( |r| self . status_to_result ( r, None ) ) . collect ( ) ,
66
+ Err ( e) => {
67
+ vec ! [ self . status_to_result( Status :: error( & format!( "Error: {}" , e) ) , None ) ]
68
+ }
69
+ }
63
70
} else {
64
71
vec ! [ ]
65
72
}
66
73
}
67
74
}
68
75
69
- pub fn return_result ( problems : Vec < Status > ) -> Box < dyn Iterator < Item = Status > > {
76
+ pub fn return_result ( problems : Vec < Status > ) -> CheckFnResult {
70
77
if problems. is_empty ( ) {
71
- Status :: just_one_pass ( )
78
+ Ok ( Status :: just_one_pass ( ) )
72
79
} else {
73
- Box :: new ( problems. into_iter ( ) )
80
+ Ok ( Box :: new ( problems. into_iter ( ) ) )
74
81
}
75
82
}
0 commit comments