@@ -40,7 +40,7 @@ public class TimeSpanParser : AbstractTypeParser<TimeSpan>
4040{
4141 private static readonly Regex _pattern = new
4242 (
43- "(?<Years>\\ d+(?=y)) |(?<Months>\\ d+(?= mo)) |(?<Weeks>\\ d+(?=w)) |(?<Days>\\ d+(?=d)) |(?<Hours>\\ d+(?=h)) |(?<Minutes>\\ d+(?=m)) |(?<Seconds>\\ d+(?=s) )" ,
43+ "^-| (?<Years>\\ d+y) |(?<Months>\\ d+mo)|(?<Weeks>\\ d+w) |(?<Days>\\ d+d) |(?<Hours>\\ d+h) |(?<Minutes>\\ d+m) |(?<Seconds>\\ d+s )" ,
4444 RegexOptions . Compiled
4545 ) ;
4646
@@ -65,6 +65,11 @@ public override ValueTask<Result<TimeSpan>> TryParseAsync(string? value, Cancell
6565 return new ValueTask < Result < TimeSpan > > ( new ParsingError < TimeSpan > ( value ) ) ;
6666 }
6767
68+ if ( value . Length != matches . Sum ( x => x . Length ) )
69+ {
70+ return new ValueTask < Result < TimeSpan > > ( new ParsingError < TimeSpan > ( value ) ) ;
71+ }
72+
6873 var timeSpan = TimeSpan . Zero ;
6974 foreach ( var match in matches . Cast < Match > ( ) )
7075 {
@@ -74,8 +79,14 @@ public override ValueTask<Result<TimeSpan>> TryParseAsync(string? value, Cancell
7479 . Skip ( 1 )
7580 . Select ( g => ( g . Name , g . Value ) ) ;
7681
77- foreach ( var ( key , groupValue ) in groups )
82+ foreach ( var ( key , groupRawValue ) in groups )
7883 {
84+ var groupValue = groupRawValue [ ..^ 1 ] ;
85+ if ( key is "Months" )
86+ {
87+ groupValue = groupValue [ ..^ 1 ] ;
88+ }
89+
7990 if ( ! double . TryParse ( groupValue , out var parsedGroupValue ) )
8091 {
8192 return new ValueTask < Result < TimeSpan > > ( new ParsingError < TimeSpan > ( value ) ) ;
@@ -123,6 +134,11 @@ public override ValueTask<Result<TimeSpan>> TryParseAsync(string? value, Cancell
123134 }
124135 }
125136
137+ if ( value [ 0 ] == '-' )
138+ {
139+ timeSpan = - timeSpan ;
140+ }
141+
126142 return new ValueTask < Result < TimeSpan > > ( timeSpan ) ;
127143 }
128144}
0 commit comments