/*
 * DO NOT EDIT.
 *
 * Generated by the protocol buffer compiler.
 * Source: google/protobuf/timestamp.proto
 *
 */

//  Protocol Buffers - Google's data interchange format
//  Copyright 2008 Google Inc.  All rights reserved.
//  https://developers.google.com/protocol-buffers/
// 
//  Redistribution and use in source and binary forms, with or without
//  modification, are permitted provided that the following conditions are
//  met:
// 
//      * Redistributions of source code must retain the above copyright
//  notice, this list of conditions and the following disclaimer.
//      * Redistributions in binary form must reproduce the above
//  copyright notice, this list of conditions and the following disclaimer
//  in the documentation and/or other materials provided with the
//  distribution.
//      * Neither the name of Google Inc. nor the names of its
//  contributors may be used to endorse or promote products derived from
//  this software without specific prior written permission.
// 
//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
//  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
//  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
//  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
//  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
//  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import Foundation



///   A Timestamp represents a point in time independent of any time zone
///   or calendar, represented as seconds and fractions of seconds at
///   nanosecond resolution in UTC Epoch time. It is encoded using the
///   Proleptic Gregorian Calendar which extends the Gregorian calendar
///   backwards to year one. It is encoded assuming all minutes are 60
///   seconds long, i.e. leap seconds are "smeared" so that no leap second
///   table is needed for interpretation. Range is from
///   0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
///   By restricting to that range, we ensure that we can convert to
///   and from  RFC 3339 date strings.
///   See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
///  
///   Example 1: Compute Timestamp from POSIX `time()`.
///  
///       Timestamp timestamp;
///       timestamp.set_seconds(time(NULL));
///       timestamp.set_nanos(0);
///  
///   Example 2: Compute Timestamp from POSIX `gettimeofday()`.
///  
///       struct timeval tv;
///       gettimeofday(&tv, NULL);
///  
///       Timestamp timestamp;
///       timestamp.set_seconds(tv.tv_sec);
///       timestamp.set_nanos(tv.tv_usec * 1000);
///  
///   Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
///  
///       FILETIME ft;
///       GetSystemTimeAsFileTime(&ft);
///       UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
///  
///       // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
///       // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
///       Timestamp timestamp;
///       timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
///       timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
///  
///   Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
///  
///       long millis = System.currentTimeMillis();
///  
///       Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
///           .setNanos((int) ((millis % 1000) * 1000000)).build();
///  
///  
///   Example 5: Compute Timestamp from current time in Python.
///  
///       now = time.time()
///       seconds = int(now)
///       nanos = int((now - seconds) * 10**9)
///       timestamp = Timestamp(seconds=seconds, nanos=nanos)
public struct Google_Protobuf_Timestamp: ProtobufGeneratedMessage {
  public var swiftClassName: String {return "Google_Protobuf_Timestamp"}
  public var protoMessageName: String {return "Timestamp"}
  public var protoPackageName: String {return "google.protobuf"}
  public var jsonFieldNames: [String: Int] {return [
    "seconds": 1,
    "nanos": 2,
  ]}
  public var protoFieldNames: [String: Int] {return [
    "seconds": 1,
    "nanos": 2,
  ]}

  ///   Represents seconds of UTC time since Unix epoch
  ///   1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
  ///   9999-12-31T23:59:59Z inclusive.
  public var seconds: Int64 = 0

  ///   Non-negative fractions of a second at nanosecond resolution. Negative
  ///   second values with fractions must still have non-negative nanos values
  ///   that count forward in time. Must be from 0 to 999,999,999
  ///   inclusive.
  public var nanos: Int32 = 0

  public init() {}

  public init(seconds: Int64? = nil,
    nanos: Int32? = nil)
  {
    if let v = seconds {
      self.seconds = v
    }
    if let v = nanos {
      self.nanos = v
    }
  }

  public mutating func _protoc_generated_decodeField(setter: inout ProtobufFieldDecoder, protoFieldNumber: Int) throws -> Bool {
    let handled: Bool
    switch protoFieldNumber {
    case 1: handled = try setter.decodeSingularField(fieldType: ProtobufInt64.self, value: &seconds)
    case 2: handled = try setter.decodeSingularField(fieldType: ProtobufInt32.self, value: &nanos)
    default:
      handled = false
    }
    return handled
  }

  public func _protoc_generated_traverse(visitor: inout ProtobufVisitor) throws {
    if seconds != 0 {
      try visitor.visitSingularField(fieldType: ProtobufInt64.self, value: seconds, protoFieldNumber: 1, protoFieldName: "seconds", jsonFieldName: "seconds", swiftFieldName: "seconds")
    }
    if nanos != 0 {
      try visitor.visitSingularField(fieldType: ProtobufInt32.self, value: nanos, protoFieldNumber: 2, protoFieldName: "nanos", jsonFieldName: "nanos", swiftFieldName: "nanos")
    }
  }

  public func _protoc_generated_isEqualTo(other: Google_Protobuf_Timestamp) -> Bool {
    if seconds != other.seconds {return false}
    if nanos != other.nanos {return false}
    return true
  }
}
