@@ -7,16 +7,12 @@ impl std::str::FromStr for ByteSize {
7
7
if let Ok ( v) = value. parse :: < u64 > ( ) {
8
8
return Ok ( Self ( v) ) ;
9
9
}
10
- let number: String = value
11
- . chars ( )
12
- . take_while ( |c| c. is_ascii_digit ( ) || c == & '.' )
13
- . collect ( ) ;
10
+ let number = take_while ( value, |c| c. is_ascii_digit ( ) || c == '.' ) ;
14
11
match number. parse :: < f64 > ( ) {
15
12
Ok ( v) => {
16
- let suffix: String = value
17
- . chars ( )
18
- . skip_while ( |c| c. is_whitespace ( ) || c. is_ascii_digit ( ) || c == & '.' )
19
- . collect ( ) ;
13
+ let suffix = skip_while ( value, |c| {
14
+ c. is_whitespace ( ) || c. is_ascii_digit ( ) || c == '.'
15
+ } ) ;
20
16
match suffix. parse :: < Unit > ( ) {
21
17
Ok ( u) => Ok ( Self ( ( v * u) as u64 ) ) ,
22
18
Err ( error) => Err ( format ! (
@@ -33,6 +29,30 @@ impl std::str::FromStr for ByteSize {
33
29
}
34
30
}
35
31
32
+ fn take_while < P > ( s : & str , mut predicate : P ) -> & str
33
+ where
34
+ P : FnMut ( char ) -> bool ,
35
+ {
36
+ let offset = s
37
+ . chars ( )
38
+ . take_while ( |ch| predicate ( * ch) )
39
+ . map ( |ch| ch. len_utf8 ( ) )
40
+ . sum ( ) ;
41
+ & s[ ..offset]
42
+ }
43
+
44
+ fn skip_while < P > ( s : & str , mut predicate : P ) -> & str
45
+ where
46
+ P : FnMut ( char ) -> bool ,
47
+ {
48
+ let offset: usize = s
49
+ . chars ( )
50
+ . skip_while ( |ch| predicate ( * ch) )
51
+ . map ( |ch| ch. len_utf8 ( ) )
52
+ . sum ( ) ;
53
+ & s[ ( s. len ( ) - offset) ..]
54
+ }
55
+
36
56
enum Unit {
37
57
Byte ,
38
58
// power of tens
0 commit comments