private void ParseExpression()

in src/Elastic.Clients.Elasticsearch/_Shared/Core/DateTime/Duration.cs [108:156]


	private void ParseExpression(string timeUnit)
	{
		var match = ExpressionRegex.Match(timeUnit);
		if (!match.Success)
			throw new ArgumentException($"Expression '{timeUnit}' is invalid", nameof(timeUnit));

		var factor = match.Groups["factor"].Value;
		if (!double.TryParse(factor, NumberStyles.Any, CultureInfo.InvariantCulture, out var f))
			throw new ArgumentException($"Expression '{timeUnit}' contains invalid factor: {factor}", nameof(timeUnit));

		Factor = f;
		var interval = match.Groups["interval"].Success ? match.Groups["interval"].Value : null;

		if (!string.IsNullOrEmpty(interval))
		{
			switch (interval.ToLowerInvariant())
			{
				case "m":
					Interval = TimeUnit.Minutes;
					break;
				case "s":
					Interval = TimeUnit.Seconds;
					break;
				case "ms":
					Interval = TimeUnit.Milliseconds;
					break;
				case "ns":
					Interval = TimeUnit.Nanoseconds;
					break;
				case "h":
					Interval = TimeUnit.Hours;
					break;
				case "d":
					Interval = TimeUnit.Days;
					break;
				case "micros":
					Interval = TimeUnit.Microseconds;
					break;
				case "nanos":
					Interval = TimeUnit.Nanoseconds;
					break;
			}
		}

		if (!Interval.HasValue)
			throw new ArgumentException($"Expression '{interval}' cannot be parsed to an interval", nameof(timeUnit));

		Milliseconds = GetExactMilliseconds(Factor.Value, Interval.Value);
	}