// 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

#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(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"));

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
