class RubyLsp::Notification

def progress_begin(id, title, percentage: nil, message: nil)

: (String id, String title, ?percentage: Integer?, ?message: String?) -> Notification
def progress_begin(id, title, percentage: nil, message: nil)
  new(
    method: "$/progress",
    params: Interface::ProgressParams.new(
      token: id,
      value: Interface::WorkDoneProgressBegin.new(
        kind: "begin",
        title: title,
        percentage: percentage,
        message: message,
      ),
    ),
  )
end

def progress_end(id)

: (String id) -> Notification
def progress_end(id)
  Notification.new(
    method: "$/progress",
    params: Interface::ProgressParams.new(
      token: id,
      value: Interface::WorkDoneProgressEnd.new(kind: "end"),
    ),
  )
end

def progress_report(id, percentage: nil, message: nil)

: (String id, ?percentage: Integer?, ?message: String?) -> Notification
def progress_report(id, percentage: nil, message: nil)
  new(
    method: "$/progress",
    params: Interface::ProgressParams.new(
      token: id,
      value: Interface::WorkDoneProgressReport.new(
        kind: "report",
        percentage: percentage,
        message: message,
      ),
    ),
  )
end

def publish_diagnostics(uri, diagnostics, version: nil)

: (String uri, Array[Interface::Diagnostic] diagnostics, ?version: Integer?) -> Notification
def publish_diagnostics(uri, diagnostics, version: nil)
  new(
    method: "textDocument/publishDiagnostics",
    params: Interface::PublishDiagnosticsParams.new(uri: uri, diagnostics: diagnostics, version: version),
  )
end

def telemetry(data)

: (Hash[Symbol, untyped] data) -> Notification
def telemetry(data)
  new(
    method: "telemetry/event",
    params: data,
  )
end

def to_hash

: -> Hash[Symbol, untyped]
@override
def to_hash
  hash = { method: @method }
  if @params
    hash[:params] = @params #: as untyped
      .to_hash
  end
  hash
end

def window_log_message(message, type: Constant::MessageType::LOG)

: (String message, ?type: Integer) -> Notification
def window_log_message(message, type: Constant::MessageType::LOG)
  new(
    method: "window/logMessage",
    params: Interface::LogMessageParams.new(type: type, message: message),
  )
end

def window_show_message(message, type: Constant::MessageType::INFO)

: (String message, ?type: Integer) -> Notification
def window_show_message(message, type: Constant::MessageType::INFO)
  new(
    method: "window/showMessage",
    params: Interface::ShowMessageParams.new(type: type, message: message),
  )
end