File: Date%2BExpressibleByArgument.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (47 lines) | stat: -rw-r--r-- 1,750 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//===----------------------------------------------------------*- swift -*-===//
//
// This source file is part of the Swift Argument Parser open source project
//
// Copyright (c) 2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//

import ArgumentParser
import Foundation

extension Foundation.Date: ArgumentParser.ExpressibleByArgument {
  // parsed as `yyyy-mm-dd`
  public init?(argument: String) {
    // ensure the input argument is composed of exactly 3 components separated
    // by dashes ('-')
    let components = argument.split(separator: "-")
    let empty = components.filter { $0.isEmpty }
    guard components.count == 3, empty.count == 0 else { return nil }

    // ensure the year component is exactly 4 characters
    let _year = components[0]
    guard _year.count == 4, let year = Int(_year) else { return nil }

    // ensure the month component is exactly 2 characters
    let _month = components[1]
    guard _month.count == 2, let month = Int(_month) else { return nil }

    // ensure the day component is exactly 2 characters
    let _day = components[2]
    guard _day.count == 2, let day = Int(_day) else { return nil }

    // ensure the combination of year, month, day is valid
    let dateComponents = DateComponents(
      calendar: Calendar(identifier: .iso8601),
      timeZone: TimeZone(identifier: "UTC"),
      year: year,
      month: month,
      day: day)
    guard dateComponents.isValidDate else { return nil }
    guard let date = dateComponents.date else { return nil }
    self = date
  }
}