protected override void ProcessRecord()
 {
     if (Sink != null && Sink.Length > 0)
     {
         foreach (string sinkName in Sink)
         {
             string formattedSinkName = PrefixProjectToSinkName(sinkName, Project);
             try
             {
                 ProjectsResource.SinksResource.GetRequest getRequest = Service.Projects.Sinks.Get(formattedSinkName);
                 WriteObject(getRequest.Execute());
             }
             catch (GoogleApiException ex) when(ex.HttpStatusCode == HttpStatusCode.NotFound)
             {
                 WriteResourceMissingError(
                     exceptionMessage: $"Sink '{sinkName}' does not exist in project '{Project}'.",
                     errorId: "SinkNotFound",
                     targetObject: sinkName);
             }
         }
     }
     else
     {
         ProjectsResource.SinksResource.ListRequest listRequest = Service.Projects.Sinks.List($"projects/{Project}");
         do
         {
             ListSinksResponse response = listRequest.Execute();
             if (response.Sinks != null)
             {
                 WriteObject(response.Sinks, true);
             }
             listRequest.PageToken = response.NextPageToken;
         }while (!Stopping && listRequest.PageToken != null);
     }
 }
        protected override LoggingBaseServiceRequest <LogSink> GetRequest(LogSink logSink)
        {
            string formattedSinkName = PrefixProjectToSinkName(SinkName, Project);

            bool destinationNotSpecified = GcsBucketDestination == null &&
                                           BigQueryDataSetDestination == null && PubSubTopicDestination == null;

            // First checks whether the sink exists or not.
            try
            {
                ProjectsResource.SinksResource.GetRequest getRequest = Service.Projects.Sinks.Get(formattedSinkName);
                LogSink existingSink = getRequest.Execute();

                // If destinations are not given, we still have to set the destination to the existing log sink destination.
                // Otherwise, the API will throw error.
                if (destinationNotSpecified)
                {
                    logSink.Destination = existingSink.Destination;
                }
            }
            catch (GoogleApiException ex) when(ex.HttpStatusCode == HttpStatusCode.NotFound)
            {
                // If log sink does not exist to begin with, then we at least need a destination for the sink.
                // So simply throws a terminating error if we don't have that.
                if (destinationNotSpecified)
                {
                    // Here we throw terminating error because the cmdlet cannot proceed without a valid sink.
                    string exceptionMessage = $"Sink '{SinkName}' does not exist in project '{Project}'." +
                                              "Please use New-GcLogSink cmdlet to create it (Set-GcLogSink can only create a sink if you supply a destination).";
                    ErrorRecord errorRecord = new ErrorRecord(
                        new ArgumentException(exceptionMessage),
                        "SinkNotFound",
                        ErrorCategory.ResourceUnavailable,
                        SinkName);
                    ThrowTerminatingError(errorRecord);
                }

                // Otherwise, returns a create request to create the log sink.
                ProjectsResource.SinksResource.CreateRequest createRequest = Service.Projects.Sinks.Create(logSink, $"projects/{Project}");
                if (UniqueWriterIdentity.IsPresent)
                {
                    createRequest.UniqueWriterIdentity = UniqueWriterIdentity.ToBool();
                }
                return(createRequest);
            }

            ProjectsResource.SinksResource.UpdateRequest updateRequest = Service.Projects.Sinks.Update(logSink, formattedSinkName);
            if (UniqueWriterIdentity.IsPresent)
            {
                updateRequest.UniqueWriterIdentity = UniqueWriterIdentity.ToBool();
            }
            return(updateRequest);
        }