File: Date%2BExpressibleByArgument.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (47 lines) | stat: -rw-r--r-- 1,724 bytes parent folder | download
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 Date: 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
  }
}