// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Generated with protocol_gen.go -- do not edit this file.
//   go run scripts/protocol_gen/protocol_gen.go
//
// DAP version 1.41.0

#include "dap/protocol.h"

namespace dap {

BreakpointEvent::BreakpointEvent() = default;
BreakpointEvent::~BreakpointEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(BreakpointEvent,
                              "breakpoint",
                              DAP_FIELD(breakpoint, "breakpoint"),
                              DAP_FIELD(reason, "reason"));

CapabilitiesEvent::CapabilitiesEvent() = default;
CapabilitiesEvent::~CapabilitiesEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(CapabilitiesEvent,
                              "capabilities",
                              DAP_FIELD(capabilities, "capabilities"));

ContinuedEvent::ContinuedEvent() = default;
ContinuedEvent::~ContinuedEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ContinuedEvent,
                              "continued",
                              DAP_FIELD(allThreadsContinued,
                                        "allThreadsContinued"),
                              DAP_FIELD(threadId, "threadId"));

ExitedEvent::ExitedEvent() = default;
ExitedEvent::~ExitedEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ExitedEvent,
                              "exited",
                              DAP_FIELD(exitCode, "exitCode"));

InitializedEvent::InitializedEvent() = default;
InitializedEvent::~InitializedEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(InitializedEvent, "initialized");

LoadedSourceEvent::LoadedSourceEvent() = default;
LoadedSourceEvent::~LoadedSourceEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(LoadedSourceEvent,
                              "loadedSource",
                              DAP_FIELD(reason, "reason"),
                              DAP_FIELD(source, "source"));

ModuleEvent::ModuleEvent() = default;
ModuleEvent::~ModuleEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ModuleEvent,
                              "module",
                              DAP_FIELD(module, "module"),
                              DAP_FIELD(reason, "reason"));

OutputEvent::OutputEvent() = default;
OutputEvent::~OutputEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(OutputEvent,
                              "output",
                              DAP_FIELD(category, "category"),
                              DAP_FIELD(column, "column"),
                              DAP_FIELD(data, "data"),
                              DAP_FIELD(group, "group"),
                              DAP_FIELD(line, "line"),
                              DAP_FIELD(output, "output"),
                              DAP_FIELD(source, "source"),
                              DAP_FIELD(variablesReference,
                                        "variablesReference"));

ProcessEvent::ProcessEvent() = default;
ProcessEvent::~ProcessEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ProcessEvent,
                              "process",
                              DAP_FIELD(isLocalProcess, "isLocalProcess"),
                              DAP_FIELD(name, "name"),
                              DAP_FIELD(pointerSize, "pointerSize"),
                              DAP_FIELD(startMethod, "startMethod"),
                              DAP_FIELD(systemProcessId, "systemProcessId"));

ProgressEndEvent::ProgressEndEvent() = default;
ProgressEndEvent::~ProgressEndEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ProgressEndEvent,
                              "progressEnd",
                              DAP_FIELD(message, "message"),
                              DAP_FIELD(progressId, "progressId"));

ProgressStartEvent::ProgressStartEvent() = default;
ProgressStartEvent::~ProgressStartEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ProgressStartEvent,
                              "progressStart",
                              DAP_FIELD(cancellable, "cancellable"),
                              DAP_FIELD(message, "message"),
                              DAP_FIELD(percentage, "percentage"),
                              DAP_FIELD(progressId, "progressId"),
                              DAP_FIELD(requestId, "requestId"),
                              DAP_FIELD(title, "title"));

ProgressUpdateEvent::ProgressUpdateEvent() = default;
ProgressUpdateEvent::~ProgressUpdateEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ProgressUpdateEvent,
                              "progressUpdate",
                              DAP_FIELD(message, "message"),
                              DAP_FIELD(percentage, "percentage"),
                              DAP_FIELD(progressId, "progressId"));

StoppedEvent::StoppedEvent() = default;
StoppedEvent::~StoppedEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(StoppedEvent,
                              "stopped",
                              DAP_FIELD(allThreadsStopped, "allThreadsStopped"),
                              DAP_FIELD(description, "description"),
                              DAP_FIELD(preserveFocusHint, "preserveFocusHint"),
                              DAP_FIELD(reason, "reason"),
                              DAP_FIELD(text, "text"),
                              DAP_FIELD(threadId, "threadId"));

TerminatedEvent::TerminatedEvent() = default;
TerminatedEvent::~TerminatedEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(TerminatedEvent,
                              "terminated",
                              DAP_FIELD(restart, "restart"));

ThreadEvent::ThreadEvent() = default;
ThreadEvent::~ThreadEvent() = default;
DAP_IMPLEMENT_STRUCT_TYPEINFO(ThreadEvent,
                              "thread",
                              DAP_FIELD(reason, "reason"),
                              DAP_FIELD(threadId, "threadId"));

}  // namespace dap
