1- use super :: parse_error:: ParseError ;
21use super :: {
32 scale_date, scale_time, DAYS_PER_MONTH , HOURS_PER_DAY , MICROS_PER_SECOND , MINUTES_PER_HOUR ,
43 MONTHS_PER_YEAR , SECONDS_PER_MIN ,
54} ;
6- use interval_norm :: IntervalNorm ;
7- use pg_interval :: Interval ;
5+ use super :: parse_error :: ParseError ;
6+ use crate :: { interval_norm :: IntervalNorm , Interval } ;
87
98enum ParserCode {
10- BADFORMAT ,
11- GOOD ,
12- DELIMFOUND ,
9+ BadFormat ,
10+ Good ,
11+ DelimFound ,
1312}
1413
1514impl Interval {
16- pub fn from_iso < ' a > ( iso_str : & ' a str ) -> Result < Interval , ParseError > {
15+ pub fn from_iso ( iso_str : & str ) -> Result < Interval , ParseError > {
1716 let mut date_part = true ;
1817 let delim = vec ! [ 'Y' , 'M' , 'D' , 'H' , 'S' ] ;
19- let mut number = "" . to_owned ( ) ;
18+ let mut number = String :: new ( ) ;
2019 let mut interval_norm = IntervalNorm :: default ( ) ;
2120 if iso_str. rfind ( 'P' ) . map_or ( false , |v| v == 1 ) {
2221 Err ( ParseError :: from_invalid_interval (
@@ -37,13 +36,13 @@ impl Interval {
3736 }
3837 let code = consume_number ( & x, & mut number, & delim) ;
3938 match code {
40- ParserCode :: BADFORMAT => {
39+ ParserCode :: BadFormat => {
4140 return Err ( ParseError :: from_invalid_interval ( "Invalid format." ) ) ;
4241 }
43- ParserCode :: GOOD => {
42+ ParserCode :: Good => {
4443 continue ;
4544 }
46- ParserCode :: DELIMFOUND => {
45+ ParserCode :: DelimFound => {
4746 let val = parse_number ( & mut number) ?;
4847 match x {
4948 'Y' => {
@@ -91,7 +90,7 @@ impl Interval {
9190 }
9291 }
9392 }
94- if number != "" {
93+ if !number . is_empty ( ) {
9594 Err ( ParseError :: from_invalid_interval (
9695 "Invalid format could not parse whole interval." ,
9796 ) )
@@ -102,24 +101,20 @@ impl Interval {
102101 }
103102}
104103
105- fn consume_number < ' a > ( val : & ' a char , number : & ' a mut String , delim : & ' a Vec < char > ) -> ParserCode {
106- if val. is_digit ( 10 ) {
107- number. push ( * val) ;
108- ParserCode :: GOOD
109- } else if number. len ( ) == 0 && * val == '-' {
110- number. push ( * val) ;
111- ParserCode :: GOOD
112- } else if number. len ( ) != 0 && * val == '.' {
104+ fn consume_number < ' a > ( val : & ' a char , number : & ' a mut String , delim : & [ char ] ) -> ParserCode {
105+ let is_first_char = number. is_empty ( ) && * val == '-' ;
106+ let is_period_char = !number. is_empty ( ) && * val == '.' ;
107+ if val. is_digit ( 10 ) || is_first_char || is_period_char {
113108 number. push ( * val) ;
114- ParserCode :: GOOD
115- } else if delim. contains ( & val) {
116- ParserCode :: DELIMFOUND
109+ ParserCode :: Good
110+ } else if delim. contains ( val) {
111+ ParserCode :: DelimFound
117112 } else {
118- ParserCode :: BADFORMAT
113+ ParserCode :: BadFormat
119114 }
120115}
121116
122- fn parse_number < ' a > ( number : & ' a mut String ) -> Result < f64 , ParseError > {
117+ fn parse_number ( number : & mut String ) -> Result < f64 , ParseError > {
123118 let parse_num = number. parse :: < f64 > ( ) ?;
124119 if parse_num > i32:: max_value ( ) as f64 {
125120 Err ( ParseError :: from_invalid_interval ( "Exceeded max value" ) )
@@ -131,7 +126,7 @@ fn parse_number<'a>(number: &'a mut String) -> Result<f64, ParseError> {
131126
132127#[ cfg( test) ]
133128mod tests {
134- use pg_interval :: Interval ;
129+ use super :: * ;
135130
136131 #[ test]
137132 fn test_from_iso_1 ( ) {
0 commit comments