/// Generated by the Protocol Buffers 3.6.0 compiler.  DO NOT EDIT!
/// Protobuf-swift version: 4.0.0
/// Source file "field_mask.proto"
/// Syntax "Proto3"

import Foundation

public extension Google.Protobuf{}

public extension Google.Protobuf {
    public struct FieldMaskRoot {
        public static let `default` = FieldMaskRoot()
        public var extensionRegistry:ExtensionRegistry

        init() {
            extensionRegistry = ExtensionRegistry()
            registerAllExtensions(registry: extensionRegistry)
            Google.Protobuf.SwiftDescriptorRoot.default.registerAllExtensions(registry: extensionRegistry)
        }
        public func registerAllExtensions(registry: ExtensionRegistry) {
        }
    }

    /// `FieldMask` represents a set of symbolic field paths, for example:
    ///     paths: "f.a"
    ///     paths: "f.b.d"
    /// Here `f` represents a field in some root message, `a` and `b`
    /// fields in the message found in `f`, and `d` a field found in the
    /// message in `f.b`.
    /// Field masks are used to specify a subset of fields that should be
    /// returned by a get operation or modified by an update operation.
    /// Field masks also have a custom JSON encoding (see below).
    /// # Field Masks in Projections
    /// When used in the context of a projection, a response message or
    /// sub-message is filtered by the API to only contain those fields as
    /// specified in the mask. For example, if the mask in the previous
    /// example is applied to a response message as follows:
    ///     f {
    ///       a : 22
    ///       b {
    ///         d : 1
    ///         x : 2
    ///       }
    ///       y : 13
    ///     }
    ///     z: 8
    /// The result will not contain specific values for fields x,y and z
    /// (there value will be set to the default, and omitted in proto text
    /// output):
    ///     f {
    ///       a : 22
    ///       b {
    ///         d : 1
    ///       }
    ///     }
    /// A repeated field is not allowed except at the last position of a
    /// field mask.
    /// If a FieldMask object is not present in a get operation, the
    /// operation applies to all fields (as if a FieldMask of all fields
    /// had been specified).
    /// Note that a field mask does not necessarily applies to the
    /// top-level response message. In case of a REST get operation, the
    /// field mask applies directly to the response, but in case of a REST
    /// list operation, the mask instead applies to each individual message
    /// in the returned resource list. In case of a REST custom method,
    /// other definitions may be used. Where the mask applies will be
    /// clearly documented together with its declaration in the API.  In
    /// any case, the effect on the returned resource/resources is required
    /// behavior for APIs.
    /// # Field Masks in Update Operations
    /// A field mask in update operations specifies which fields of the
    /// targeted resource are going to be updated. The API is required
    /// to only change the values of the fields as specified in the mask
    /// and leave the others untouched. If a resource is passed in to
    /// describe the updated values, the API ignores the values of all
    /// fields not covered by the mask.
    /// In order to reset a field's value to the default, the field must
    /// be in the mask and set to the default value in the provided resource.
    /// Hence, in order to reset all fields of a resource, provide a default
    /// instance of the resource and set all fields in the mask, or do
    /// not provide a mask as described below.
    /// If a field mask is not present on update, the operation applies to
    /// all fields (as if a field mask of all fields has been specified).
    /// Note that in the presence of schema evolution, this may mean that
    /// fields the client does not know and has therefore not filled into
    /// the request will be reset to their default. If this is unwanted
    /// behavior, a specific service may require a client to always specify
    /// a field mask, producing an error if not.
    /// As with get operations, the location of the resource which
    /// describes the updated values in the request message depends on the
    /// operation kind. In any case, the effect of the field mask is
    /// required to be honored by the API.
    /// ## Considerations for HTTP REST
    /// The HTTP kind of an update operation which uses a field mask must
    /// be set to PATCH instead of PUT in order to satisfy HTTP semantics
    /// (PUT must only be used for full updates).
    /// # JSON Encoding of Field Masks
    /// In JSON, a field mask is encoded as a single string where paths are
    /// separated by a comma. Fields name in each path are converted
    /// to/from lower-camel naming conventions.
    /// As an example, consider the following message declarations:
    ///     message Profile {
    ///       User user = 1;
    ///       Photo photo = 2;
    ///     }
    ///     message User {
    ///       string display_name = 1;
    ///       string address = 2;
    ///     }
    /// In proto a field mask for `Profile` may look as such:
    ///     mask {
    ///       paths: "user.display_name"
    ///       paths: "photo"
    ///     }
    /// In JSON, the same mask is represented as below:
    ///     {
    ///       mask: "user.displayName,photo"
    ///     }
    final public class FieldMask : GeneratedMessage {
        public typealias BuilderType = Google.Protobuf.FieldMask.Builder

        public static func == (lhs: Google.Protobuf.FieldMask, rhs: Google.Protobuf.FieldMask) -> Bool {
            if lhs === rhs {
                return true
            }
            var fieldCheck:Bool = (lhs.hashValue == rhs.hashValue)
            fieldCheck = fieldCheck && (lhs.paths == rhs.paths)
            fieldCheck = (fieldCheck && (lhs.unknownFields == rhs.unknownFields))
            return fieldCheck
        }

        /// The set of field mask paths.
        public fileprivate(set) var paths:Array<String> = Array<String>()
        required public init() {
            super.init()
        }
        override public func isInitialized() throws {
        }
        override public func writeTo(codedOutputStream: CodedOutputStream) throws {
            if !paths.isEmpty {
                for oneValuepaths in paths {
                    try codedOutputStream.writeString(fieldNumber: 1, value:oneValuepaths)
                }
            }
            try unknownFields.writeTo(codedOutputStream: codedOutputStream)
        }
        override public func serializedSize() -> Int32 {
            var serialize_size:Int32 = memoizedSerializedSize
            if serialize_size != -1 {
             return serialize_size
            }

            serialize_size = 0
            var dataSizePaths:Int32 = 0
            for oneValuepaths in paths {
                dataSizePaths += oneValuepaths.computeStringSizeNoTag()
            }
            serialize_size += dataSizePaths
            serialize_size += 1 * Int32(paths.count)
            serialize_size += unknownFields.serializedSize()
            memoizedSerializedSize = serialize_size
            return serialize_size
        }
        public class func getBuilder() -> Google.Protobuf.FieldMask.Builder {
            return Google.Protobuf.FieldMask.classBuilder() as! Google.Protobuf.FieldMask.Builder
        }
        public func getBuilder() -> Google.Protobuf.FieldMask.Builder {
            return classBuilder() as! Google.Protobuf.FieldMask.Builder
        }
        override public class func classBuilder() -> ProtocolBuffersMessageBuilder {
            return Google.Protobuf.FieldMask.Builder()
        }
        override public func classBuilder() -> ProtocolBuffersMessageBuilder {
            return Google.Protobuf.FieldMask.Builder()
        }
        public func toBuilder() throws -> Google.Protobuf.FieldMask.Builder {
            return try Google.Protobuf.FieldMask.builderWithPrototype(prototype:self)
        }
        public class func builderWithPrototype(prototype:Google.Protobuf.FieldMask) throws -> Google.Protobuf.FieldMask.Builder {
            return try Google.Protobuf.FieldMask.Builder().mergeFrom(other:prototype)
        }
        override public func encode() throws -> Dictionary<String,Any> {
            try isInitialized()
            var jsonMap:Dictionary<String,Any> = Dictionary<String,Any>()
            if !paths.isEmpty {
                var jsonArrayPaths:Array<String> = []
                for oneValuePaths in paths {
                    jsonArrayPaths.append(oneValuePaths)
                }
                jsonMap["paths"] = jsonArrayPaths
            }
            return jsonMap
        }
        override class public func decode(jsonMap:Dictionary<String,Any>) throws -> Google.Protobuf.FieldMask {
            return try Google.Protobuf.FieldMask.Builder.decodeToBuilder(jsonMap:jsonMap).build()
        }
        override class public func fromJSON(data:Data, options: JSONSerialization.ReadingOptions = []) throws -> Google.Protobuf.FieldMask {
            return try Google.Protobuf.FieldMask.Builder.fromJSONToBuilder(data:data, options:options).build()
        }
        override public func getDescription(indent:String) throws -> String {
            var output = ""
            var pathsElementIndex:Int = 0
            for oneValuePaths in paths  {
                output += "\(indent) paths[\(pathsElementIndex)]: \(oneValuePaths)\n"
                pathsElementIndex += 1
            }
            output += unknownFields.getDescription(indent: indent)
            return output
        }
        override public var hashValue:Int {
            get {
                var hashCode:Int = 7
                for oneValuePaths in paths {
                    hashCode = (hashCode &* 31) &+ oneValuePaths.hashValue
                }
                hashCode = (hashCode &* 31) &+  unknownFields.hashValue
                return hashCode
            }
        }


        //Meta information declaration start

        override public class func className() -> String {
            return "Google.Protobuf.FieldMask"
        }
        override public func className() -> String {
            return "Google.Protobuf.FieldMask"
        }
        //Meta information declaration end

        final public class Builder : GeneratedMessageBuilder {
            fileprivate var builderResult:Google.Protobuf.FieldMask = Google.Protobuf.FieldMask()
            public func getMessage() -> Google.Protobuf.FieldMask {
                return builderResult
            }

            required override public init () {
                super.init()
            }
            /// The set of field mask paths.
            public var paths:Array<String> {
                get {
                    return builderResult.paths
                }
                set (array) {
                    builderResult.paths = array
                }
            }
            @discardableResult
            public func setPaths(_ value:Array<String>) -> Google.Protobuf.FieldMask.Builder {
                self.paths = value
                return self
            }
            @discardableResult
            public func clearPaths() -> Google.Protobuf.FieldMask.Builder {
                builderResult.paths.removeAll(keepingCapacity: false)
                return self
            }
            override public var internalGetResult:GeneratedMessage {
                get {
                    return builderResult
                }
            }
            @discardableResult
            override public func clear() -> Google.Protobuf.FieldMask.Builder {
                builderResult = Google.Protobuf.FieldMask()
                return self
            }
            override public func clone() throws -> Google.Protobuf.FieldMask.Builder {
                return try Google.Protobuf.FieldMask.builderWithPrototype(prototype:builderResult)
            }
            override public func build() throws -> Google.Protobuf.FieldMask {
                try checkInitialized()
                return buildPartial()
            }
            public func buildPartial() -> Google.Protobuf.FieldMask {
                let returnMe:Google.Protobuf.FieldMask = builderResult
                return returnMe
            }
            @discardableResult
            public func mergeFrom(other:Google.Protobuf.FieldMask) throws -> Google.Protobuf.FieldMask.Builder {
                if other == Google.Protobuf.FieldMask() {
                    return self
                }
                if !other.paths.isEmpty {
                    builderResult.paths += other.paths
                }
                try merge(unknownField: other.unknownFields)
                return self
            }
            @discardableResult
            override public func mergeFrom(codedInputStream: CodedInputStream) throws -> Google.Protobuf.FieldMask.Builder {
                return try mergeFrom(codedInputStream: codedInputStream, extensionRegistry:ExtensionRegistry())
            }
            @discardableResult
            override public func mergeFrom(codedInputStream: CodedInputStream, extensionRegistry:ExtensionRegistry) throws -> Google.Protobuf.FieldMask.Builder {
                let unknownFieldsBuilder:UnknownFieldSet.Builder = try UnknownFieldSet.builderWithUnknownFields(copyFrom:self.unknownFields)
                while (true) {
                    let protobufTag = try codedInputStream.readTag()
                    switch protobufTag {
                    case 0: 
                        self.unknownFields = try unknownFieldsBuilder.build()
                        return self

                    case 10:
                        paths += [try codedInputStream.readString()]

                    default:
                        if (!(try parse(codedInputStream:codedInputStream, unknownFields:unknownFieldsBuilder, extensionRegistry:extensionRegistry, tag:protobufTag))) {
                            unknownFields = try unknownFieldsBuilder.build()
                            return self
                        }
                    }
                }
            }
            class override public func decodeToBuilder(jsonMap:Dictionary<String,Any>) throws -> Google.Protobuf.FieldMask.Builder {
                let resultDecodedBuilder = Google.Protobuf.FieldMask.Builder()
                if let jsonValuePaths = jsonMap["paths"] as? Array<String> {
                    var jsonArrayPaths:Array<String> = []
                    for oneValuePaths in jsonValuePaths {
                        jsonArrayPaths.append(oneValuePaths)
                    }
                    resultDecodedBuilder.paths = jsonArrayPaths
                }
                return resultDecodedBuilder
            }
            override class public func fromJSONToBuilder(data:Data, options: JSONSerialization.ReadingOptions = []) throws -> Google.Protobuf.FieldMask.Builder {
                let jsonData = try JSONSerialization.jsonObject(with:data, options: options)
                guard let jsDataCast = jsonData as? Dictionary<String,Any> else {
                  throw ProtocolBuffersError.invalidProtocolBuffer("Invalid JSON data")
                }
                return try Google.Protobuf.FieldMask.Builder.decodeToBuilder(jsonMap:jsDataCast)
            }
        }

    }

}
extension Google.Protobuf.FieldMask: GeneratedMessageProtocol {
    public class func parseArrayDelimitedFrom(inputStream: InputStream) throws -> Array<Google.Protobuf.FieldMask> {
        var mergedArray = Array<Google.Protobuf.FieldMask>()
        while let value = try parseDelimitedFrom(inputStream: inputStream) {
          mergedArray.append(value)
        }
        return mergedArray
    }
    public class func parseDelimitedFrom(inputStream: InputStream) throws -> Google.Protobuf.FieldMask? {
        return try Google.Protobuf.FieldMask.Builder().mergeDelimitedFrom(inputStream: inputStream)?.build()
    }
    public class func parseFrom(data: Data) throws -> Google.Protobuf.FieldMask {
        return try Google.Protobuf.FieldMask.Builder().mergeFrom(data: data, extensionRegistry:Google.Protobuf.FieldMaskRoot.default.extensionRegistry).build()
    }
    public class func parseFrom(data: Data, extensionRegistry:ExtensionRegistry) throws -> Google.Protobuf.FieldMask {
        return try Google.Protobuf.FieldMask.Builder().mergeFrom(data: data, extensionRegistry:extensionRegistry).build()
    }
    public class func parseFrom(inputStream: InputStream) throws -> Google.Protobuf.FieldMask {
        return try Google.Protobuf.FieldMask.Builder().mergeFrom(inputStream: inputStream).build()
    }
    public class func parseFrom(inputStream: InputStream, extensionRegistry:ExtensionRegistry) throws -> Google.Protobuf.FieldMask {
        return try Google.Protobuf.FieldMask.Builder().mergeFrom(inputStream: inputStream, extensionRegistry:extensionRegistry).build()
    }
    public class func parseFrom(codedInputStream: CodedInputStream) throws -> Google.Protobuf.FieldMask {
        return try Google.Protobuf.FieldMask.Builder().mergeFrom(codedInputStream: codedInputStream).build()
    }
    public class func parseFrom(codedInputStream: CodedInputStream, extensionRegistry:ExtensionRegistry) throws -> Google.Protobuf.FieldMask {
        return try Google.Protobuf.FieldMask.Builder().mergeFrom(codedInputStream: codedInputStream, extensionRegistry:extensionRegistry).build()
    }
    public subscript(key: String) -> Any? {
        switch key {
        case "paths": return self.paths
        default: return nil
        }
    }
}
extension Google.Protobuf.FieldMask.Builder: GeneratedMessageBuilderProtocol {
    public typealias GeneratedMessageType = Google.Protobuf.FieldMask
    public subscript(key: String) -> Any? {
        get { 
            switch key {
            case "paths": return self.paths
            default: return nil
            }
        }
        set (newSubscriptValue) { 
            switch key {
            case "paths":
                guard let newSubscriptValue = newSubscriptValue as? Array<String> else {
                    return
                }
                self.paths = newSubscriptValue
            default: return
            }
        }
    }
}

// @@protoc_insertion_point(global_scope)
