1fd4e5da5Sopenharmony_ci// Copyright 2018 The Go Authors.
2fd4e5da5Sopenharmony_ci//
3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License.
5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at
6fd4e5da5Sopenharmony_ci//
7fd4e5da5Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8fd4e5da5Sopenharmony_ci//
9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and
13fd4e5da5Sopenharmony_ci// limitations under the License.
14fd4e5da5Sopenharmony_ci
15fd4e5da5Sopenharmony_cipackage protocol
16fd4e5da5Sopenharmony_ci
17fd4e5da5Sopenharmony_ciimport (
18fd4e5da5Sopenharmony_ci	"context"
19fd4e5da5Sopenharmony_ci	"encoding/json"
20fd4e5da5Sopenharmony_ci	"log"
21fd4e5da5Sopenharmony_ci
22fd4e5da5Sopenharmony_ci	"github.com/KhronosGroup/SPIRV-Tools/utils/vscode/src/lsp/jsonrpc2"
23fd4e5da5Sopenharmony_ci)
24fd4e5da5Sopenharmony_ci
25fd4e5da5Sopenharmony_ciconst (
26fd4e5da5Sopenharmony_ci	// RequestCancelledError should be used when a request is cancelled early.
27fd4e5da5Sopenharmony_ci	RequestCancelledError = -32800
28fd4e5da5Sopenharmony_ci)
29fd4e5da5Sopenharmony_ci
30fd4e5da5Sopenharmony_citype DocumentUri = string
31fd4e5da5Sopenharmony_ci
32fd4e5da5Sopenharmony_citype canceller struct{ jsonrpc2.EmptyHandler }
33fd4e5da5Sopenharmony_ci
34fd4e5da5Sopenharmony_citype clientHandler struct {
35fd4e5da5Sopenharmony_ci	canceller
36fd4e5da5Sopenharmony_ci	client Client
37fd4e5da5Sopenharmony_ci}
38fd4e5da5Sopenharmony_ci
39fd4e5da5Sopenharmony_citype serverHandler struct {
40fd4e5da5Sopenharmony_ci	canceller
41fd4e5da5Sopenharmony_ci	server Server
42fd4e5da5Sopenharmony_ci}
43fd4e5da5Sopenharmony_ci
44fd4e5da5Sopenharmony_cifunc (canceller) Request(ctx context.Context, conn *jsonrpc2.Conn, direction jsonrpc2.Direction, r *jsonrpc2.WireRequest) context.Context {
45fd4e5da5Sopenharmony_ci	if direction == jsonrpc2.Receive && r.Method == "$/cancelRequest" {
46fd4e5da5Sopenharmony_ci		var params CancelParams
47fd4e5da5Sopenharmony_ci		if err := json.Unmarshal(*r.Params, &params); err != nil {
48fd4e5da5Sopenharmony_ci			log.Printf("%v", err)
49fd4e5da5Sopenharmony_ci		} else {
50fd4e5da5Sopenharmony_ci			conn.Cancel(params.ID)
51fd4e5da5Sopenharmony_ci		}
52fd4e5da5Sopenharmony_ci	}
53fd4e5da5Sopenharmony_ci	return ctx
54fd4e5da5Sopenharmony_ci}
55fd4e5da5Sopenharmony_ci
56fd4e5da5Sopenharmony_cifunc (canceller) Cancel(ctx context.Context, conn *jsonrpc2.Conn, id jsonrpc2.ID, cancelled bool) bool {
57fd4e5da5Sopenharmony_ci	if cancelled {
58fd4e5da5Sopenharmony_ci		return false
59fd4e5da5Sopenharmony_ci	}
60fd4e5da5Sopenharmony_ci	conn.Notify(ctx, "$/cancelRequest", &CancelParams{ID: id})
61fd4e5da5Sopenharmony_ci	return true
62fd4e5da5Sopenharmony_ci}
63fd4e5da5Sopenharmony_ci
64fd4e5da5Sopenharmony_cifunc NewClient(ctx context.Context, stream jsonrpc2.Stream, client Client) (context.Context, *jsonrpc2.Conn, Server) {
65fd4e5da5Sopenharmony_ci	ctx = WithClient(ctx, client)
66fd4e5da5Sopenharmony_ci	conn := jsonrpc2.NewConn(stream)
67fd4e5da5Sopenharmony_ci	conn.AddHandler(&clientHandler{client: client})
68fd4e5da5Sopenharmony_ci	return ctx, conn, &serverDispatcher{Conn: conn}
69fd4e5da5Sopenharmony_ci}
70fd4e5da5Sopenharmony_ci
71fd4e5da5Sopenharmony_cifunc NewServer(ctx context.Context, stream jsonrpc2.Stream, server Server) (context.Context, *jsonrpc2.Conn, Client) {
72fd4e5da5Sopenharmony_ci	conn := jsonrpc2.NewConn(stream)
73fd4e5da5Sopenharmony_ci	client := &clientDispatcher{Conn: conn}
74fd4e5da5Sopenharmony_ci	ctx = WithClient(ctx, client)
75fd4e5da5Sopenharmony_ci	conn.AddHandler(&serverHandler{server: server})
76fd4e5da5Sopenharmony_ci	return ctx, conn, client
77fd4e5da5Sopenharmony_ci}
78fd4e5da5Sopenharmony_ci
79fd4e5da5Sopenharmony_cifunc sendParseError(ctx context.Context, req *jsonrpc2.Request, err error) {
80fd4e5da5Sopenharmony_ci	if _, ok := err.(*jsonrpc2.Error); !ok {
81fd4e5da5Sopenharmony_ci		err = jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
82fd4e5da5Sopenharmony_ci	}
83fd4e5da5Sopenharmony_ci	if err := req.Reply(ctx, nil, err); err != nil {
84fd4e5da5Sopenharmony_ci		log.Printf("%v", err)
85fd4e5da5Sopenharmony_ci	}
86fd4e5da5Sopenharmony_ci}
87