// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated for LSP. DO NOT EDIT.

package protocol

// Code generated from protocol/metaModel.json at ref release/protocol/3.18.2 (hash 20969f3e75cb3cd35c2bb794b1d15cc2dfbe4abb).
// https://github.com/microsoft/vscode-languageserver-node/blob/release/protocol/3.18.2/protocol/metaModel.json
// LSP metaData.version = 3.18.0.

import (
	"context"
	"encoding/json"
	"fmt"

	"golang.org/x/tools/internal/jsonrpc2"
)

type Client interface {
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#logTrace
	LogTrace(context.Context, *LogTraceParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#progress
	Progress(context.Context, *ProgressParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#client_registerCapability
	RegisterCapability(context.Context, *RegistrationParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#client_unregisterCapability
	UnregisterCapability(context.Context, *UnregistrationParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#telemetry_event
	Event(context.Context, *any) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#textDocument_publishDiagnostics
	PublishDiagnostics(context.Context, *PublishDiagnosticsParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#window_logMessage
	LogMessage(context.Context, *LogMessageParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#window_showDocument
	ShowDocument(context.Context, *ShowDocumentParams) (*ShowDocumentResult, error)
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#window_showMessage
	ShowMessage(context.Context, *ShowMessageParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#window_showMessageRequest
	ShowMessageRequest(context.Context, *ShowMessageRequestParams) (*MessageActionItem, error)
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#window_workDoneProgress_create
	WorkDoneProgressCreate(context.Context, *WorkDoneProgressCreateParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_applyEdit
	ApplyEdit(context.Context, *ApplyWorkspaceEditParams) (*ApplyWorkspaceEditResult, error)
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_codeLens_refresh
	CodeLensRefresh(context.Context) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_configuration
	Configuration(context.Context, *ParamConfiguration) ([]LSPAny, error)
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_diagnostic_refresh
	DiagnosticRefresh(context.Context) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_foldingRange_refresh
	FoldingRangeRefresh(context.Context) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_inlayHint_refresh
	InlayHintRefresh(context.Context) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_inlineValue_refresh
	InlineValueRefresh(context.Context) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_semanticTokens_refresh
	SemanticTokensRefresh(context.Context) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_textDocumentContent_refresh
	TextDocumentContentRefresh(context.Context, *TextDocumentContentRefreshParams) error
	// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification#workspace_workspaceFolders
	WorkspaceFolders(context.Context) ([]WorkspaceFolder, error)
}

func clientDispatch(ctx context.Context, client Client, reply jsonrpc2.Replier, r jsonrpc2.Request) (bool, error) {
	resp, valid, err := ClientDispatchCall(ctx, client, r.Method(), r.Params())
	if !valid {
		return false, nil
	}

	if err != nil {
		return valid, reply(ctx, nil, err)
	} else {
		return valid, reply(ctx, resp, nil)
	}
}

func ClientDispatchCall(ctx context.Context, client Client, method string, raw json.RawMessage) (resp any, _ bool, err error) {
	switch method {
	case "$/logTrace":
		var params LogTraceParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.LogTrace(ctx, &params)
		return nil, true, err

	case "$/progress":
		var params ProgressParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.Progress(ctx, &params)
		return nil, true, err

	case "client/registerCapability":
		var params RegistrationParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.RegisterCapability(ctx, &params)
		return nil, true, err

	case "client/unregisterCapability":
		var params UnregistrationParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.UnregisterCapability(ctx, &params)
		return nil, true, err

	case "telemetry/event":
		var params any
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.Event(ctx, &params)
		return nil, true, err

	case "textDocument/publishDiagnostics":
		var params PublishDiagnosticsParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.PublishDiagnostics(ctx, &params)
		return nil, true, err

	case "window/logMessage":
		var params LogMessageParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.LogMessage(ctx, &params)
		return nil, true, err

	case "window/showDocument":
		var params ShowDocumentParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		resp, err := client.ShowDocument(ctx, &params)
		if err != nil {
			return nil, true, err
		}
		return resp, true, nil

	case "window/showMessage":
		var params ShowMessageParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.ShowMessage(ctx, &params)
		return nil, true, err

	case "window/showMessageRequest":
		var params ShowMessageRequestParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		resp, err := client.ShowMessageRequest(ctx, &params)
		if err != nil {
			return nil, true, err
		}
		return resp, true, nil

	case "window/workDoneProgress/create":
		var params WorkDoneProgressCreateParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.WorkDoneProgressCreate(ctx, &params)
		return nil, true, err

	case "workspace/applyEdit":
		var params ApplyWorkspaceEditParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		resp, err := client.ApplyEdit(ctx, &params)
		if err != nil {
			return nil, true, err
		}
		return resp, true, nil

	case "workspace/codeLens/refresh":
		err := client.CodeLensRefresh(ctx)
		return nil, true, err

	case "workspace/configuration":
		var params ParamConfiguration
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		resp, err := client.Configuration(ctx, &params)
		if err != nil {
			return nil, true, err
		}
		return resp, true, nil

	case "workspace/diagnostic/refresh":
		err := client.DiagnosticRefresh(ctx)
		return nil, true, err

	case "workspace/foldingRange/refresh":
		err := client.FoldingRangeRefresh(ctx)
		return nil, true, err

	case "workspace/inlayHint/refresh":
		err := client.InlayHintRefresh(ctx)
		return nil, true, err

	case "workspace/inlineValue/refresh":
		err := client.InlineValueRefresh(ctx)
		return nil, true, err

	case "workspace/semanticTokens/refresh":
		err := client.SemanticTokensRefresh(ctx)
		return nil, true, err

	case "workspace/textDocumentContent/refresh":
		var params TextDocumentContentRefreshParams
		if err := UnmarshalJSON(raw, &params); err != nil {
			return nil, true, fmt.Errorf("%w: %s", jsonrpc2.ErrParse, err)
		}
		err := client.TextDocumentContentRefresh(ctx, &params)
		return nil, true, err

	case "workspace/workspaceFolders":
		resp, err := client.WorkspaceFolders(ctx)
		if err != nil {
			return nil, true, err
		}
		return resp, true, nil

	default:
		return nil, false, nil
	}
}

func (s *clientDispatcher) LogTrace(ctx context.Context, params *LogTraceParams) error {
	return s.sender.Notify(ctx, "$/logTrace", params)
}
func (s *clientDispatcher) Progress(ctx context.Context, params *ProgressParams) error {
	return s.sender.Notify(ctx, "$/progress", params)
}
func (s *clientDispatcher) RegisterCapability(ctx context.Context, params *RegistrationParams) error {
	return s.sender.Call(ctx, "client/registerCapability", params, nil)
}
func (s *clientDispatcher) UnregisterCapability(ctx context.Context, params *UnregistrationParams) error {
	return s.sender.Call(ctx, "client/unregisterCapability", params, nil)
}
func (s *clientDispatcher) Event(ctx context.Context, params *any) error {
	return s.sender.Notify(ctx, "telemetry/event", params)
}
func (s *clientDispatcher) PublishDiagnostics(ctx context.Context, params *PublishDiagnosticsParams) error {
	return s.sender.Notify(ctx, "textDocument/publishDiagnostics", params)
}
func (s *clientDispatcher) LogMessage(ctx context.Context, params *LogMessageParams) error {
	return s.sender.Notify(ctx, "window/logMessage", params)
}
func (s *clientDispatcher) ShowDocument(ctx context.Context, params *ShowDocumentParams) (*ShowDocumentResult, error) {
	var result *ShowDocumentResult
	if err := s.sender.Call(ctx, "window/showDocument", params, &result); err != nil {
		return nil, err
	}
	return result, nil
}
func (s *clientDispatcher) ShowMessage(ctx context.Context, params *ShowMessageParams) error {
	return s.sender.Notify(ctx, "window/showMessage", params)
}
func (s *clientDispatcher) ShowMessageRequest(ctx context.Context, params *ShowMessageRequestParams) (*MessageActionItem, error) {
	var result *MessageActionItem
	if err := s.sender.Call(ctx, "window/showMessageRequest", params, &result); err != nil {
		return nil, err
	}
	return result, nil
}
func (s *clientDispatcher) WorkDoneProgressCreate(ctx context.Context, params *WorkDoneProgressCreateParams) error {
	return s.sender.Call(ctx, "window/workDoneProgress/create", params, nil)
}
func (s *clientDispatcher) ApplyEdit(ctx context.Context, params *ApplyWorkspaceEditParams) (*ApplyWorkspaceEditResult, error) {
	var result *ApplyWorkspaceEditResult
	if err := s.sender.Call(ctx, "workspace/applyEdit", params, &result); err != nil {
		return nil, err
	}
	return result, nil
}
func (s *clientDispatcher) CodeLensRefresh(ctx context.Context) error {
	return s.sender.Call(ctx, "workspace/codeLens/refresh", nil, nil)
}
func (s *clientDispatcher) Configuration(ctx context.Context, params *ParamConfiguration) ([]LSPAny, error) {
	var result []LSPAny
	if err := s.sender.Call(ctx, "workspace/configuration", params, &result); err != nil {
		return nil, err
	}
	return result, nil
}
func (s *clientDispatcher) DiagnosticRefresh(ctx context.Context) error {
	return s.sender.Call(ctx, "workspace/diagnostic/refresh", nil, nil)
}
func (s *clientDispatcher) FoldingRangeRefresh(ctx context.Context) error {
	return s.sender.Call(ctx, "workspace/foldingRange/refresh", nil, nil)
}
func (s *clientDispatcher) InlayHintRefresh(ctx context.Context) error {
	return s.sender.Call(ctx, "workspace/inlayHint/refresh", nil, nil)
}
func (s *clientDispatcher) InlineValueRefresh(ctx context.Context) error {
	return s.sender.Call(ctx, "workspace/inlineValue/refresh", nil, nil)
}
func (s *clientDispatcher) SemanticTokensRefresh(ctx context.Context) error {
	return s.sender.Call(ctx, "workspace/semanticTokens/refresh", nil, nil)
}
func (s *clientDispatcher) TextDocumentContentRefresh(ctx context.Context, params *TextDocumentContentRefreshParams) error {
	return s.sender.Call(ctx, "workspace/textDocumentContent/refresh", params, nil)
}
func (s *clientDispatcher) WorkspaceFolders(ctx context.Context) ([]WorkspaceFolder, error) {
	var result []WorkspaceFolder
	if err := s.sender.Call(ctx, "workspace/workspaceFolders", nil, &result); err != nil {
		return nil, err
	}
	return result, nil
}
