-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmain.go
132 lines (109 loc) · 2.66 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
"github.com/TobiasYin/go-lsp/logs"
"github.com/TobiasYin/go-lsp/lsp"
"github.com/TobiasYin/go-lsp/lsp/defines"
)
type Snippets map[string]Snippet
type Snippet struct {
Prefix Prefix `json:"prefix"`
Body Body `json:"body"`
Descripttion string `json:"description"`
}
type Prefix struct {
Value interface{}
}
func (p *Prefix) UnmarshalJSON(data []byte) error {
var singleWord string
if err := json.Unmarshal(data, &singleWord); err == nil {
p.Value = singleWord
return nil
}
var multipleWords []string
if err := json.Unmarshal(data, &multipleWords); err == nil {
p.Value = multipleWords
return nil
}
return fmt.Errorf("Cannot unmarshal snippet body: %s", data)
}
func (p Prefix) ToStringSlice() []string {
switch v := p.Value.(type) {
case string:
return []string{v}
case []string:
return v
default:
return nil
}
}
type Body struct {
Value interface{}
}
func (b *Body) UnmarshalJSON(data []byte) error {
var singleLine string
if err := json.Unmarshal(data, &singleLine); err == nil {
b.Value = singleLine
return nil
}
var multipleLines []string
if err := json.Unmarshal(data, &multipleLines); err == nil {
b.Value = multipleLines
return nil
}
return fmt.Errorf("Cannot unmarshal snippet body: %s", data)
}
func (b Body) String() string {
switch v := b.Value.(type) {
case string:
return v
case []string:
return strings.Join(v, "\n")
default:
return ""
}
}
func main() {
configPath := flag.String("config", "snippets.json", "Path to the json snippets file")
flag.Parse()
data, err := ioutil.ReadFile(*configPath)
if err != nil {
log.Fatalf("Error reading config file: %v", err)
}
var snippets Snippets
if err := json.Unmarshal(data, &snippets); err != nil {
log.Fatalf("Error unmarshalling config data: %v", err)
}
logger := log.New(os.Stdout, "snippets-ls: ", log.LstdFlags)
logs.Init(logger)
server := lsp.NewServer(&lsp.Options{CompletionProvider: &defines.CompletionOptions{
TriggerCharacters: &[]string{"."},
}})
items := make([]defines.CompletionItem, 0)
k := defines.CompletionItemKindSnippet
for _, snippet := range snippets {
for _, prefix := range snippet.Prefix.ToStringSlice() {
item := defines.CompletionItem{
Kind: &k,
Label: prefix,
InsertText: strPtr(fmt.Sprintf("%s", snippet.Body)),
}
items = append(items, item)
}
}
server.OnCompletion(func(ctx context.Context, req *defines.CompletionParams) (result *[]defines.CompletionItem, err error) {
logs.Println(req)
return &items, nil
})
server.Run()
}
func strPtr(s string) *string {
return &s
}