DurationValue.fromCrawledStringValue constructor

DurationValue.fromCrawledStringValue(
  1. String value
)

Implementation

factory DurationValue.fromCrawledStringValue(String value) {
  final durRegexp = RegExp(r'(?:([0-9]+)(D|W|H|M|S))', caseSensitive: false);
  final durMatches = durRegexp.allMatches(value);
  final hasWeeks = durMatches.map((e) => e.group(2)).any(
        (element) => element?.toUpperCase() == "W",
      );
  final hasDays = durMatches.map((e) => e.group(2)).any(
        (element) => element?.toUpperCase() == "D",
      );
  final hasHours = durMatches.map((e) => e.group(2)).any(
        (element) => element?.toUpperCase() == "H",
      );
  final hasMinutes = durMatches.map((e) => e.group(2)).any(
        (element) => element?.toUpperCase() == "M",
      );
  final hasSeconds = durMatches.map((e) => e.group(2)).any(
        (element) => element?.toUpperCase() == "S",
      );

  if (hasWeeks) {
    return DurationValue(
        Duration(
          days: int.parse(
            durMatches
                .firstWhere(
                    (element) => element.group(2)?.toUpperCase() == "W")
                .group(1)!,
          ),
        ),
        inWeeks: true);
  }

  return DurationValue(
    Duration(
      days: hasDays
          ? int.parse(
              durMatches
                  .firstWhere(
                      (element) => element.group(2)?.toUpperCase() == "D")
                  .group(1)!,
            )
          : 0,
      hours: hasHours
          ? int.parse(
              durMatches
                  .firstWhere(
                      (element) => element.group(2)?.toUpperCase() == "H")
                  .group(1)!,
            )
          : 0,
      minutes: hasMinutes
          ? int.parse(
              durMatches
                  .firstWhere(
                      (element) => element.group(2)?.toUpperCase() == "M")
                  .group(1)!,
            )
          : 0,
      seconds: hasSeconds
          ? int.parse(
              durMatches
                  .firstWhere(
                      (element) => element.group(2)?.toUpperCase() == "S")
                  .group(1)!,
            )
          : 0,
    ),
    inWeeks: false,
  );
}