-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
153 lines (129 loc) · 3.99 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// TODO: vimFilePath の名前変更(hostVimFilePath?)
package main
import (
_ "embed"
"fmt"
"os"
"github.com/urfave/cli/v2"
"github.com/mikoto2000/devcontainer.vim/devcontainer"
"github.com/mikoto2000/devcontainer.vim/docker"
"github.com/mikoto2000/devcontainer.vim/tools"
"github.com/mikoto2000/devcontainer.vim/util"
)
const FLAG_NAME_LICENSE = "license"
const FLAG_NAME_HELP_LONG = "help"
const FLAG_NAME_HELP_SHORT = "h"
const FLAG_NAME_VERSION_LONG = "version"
const SPLIT_ARG_MARK = "--"
//go:embed LICENSE
var license string
//go:embed NOTICE
var notice string
const APP_NAME = "devcontainer.vim"
func main() {
// コマンドラインオプションのパース
// devcontainer.vim 用のディレクトリ作成
// 1. ユーザーコンフィグ用ディレクトリ
// `os.UserConfigDir` + `devcontainer.vim`
// 2. ユーザーキャッシュ用ディレクトリ
// `os.UserCacheDir` + `devcontainer.vim`
util.CreateDirectory(os.UserConfigDir, APP_NAME)
appCacheDir := util.CreateDirectory(os.UserCacheDir, APP_NAME)
devcontainerVimArgProcess := (&cli.App{
Name: "devcontainer.vim",
Usage: "devcontainer for vim.",
Version: "0.0.1",
UseShortOptionHandling: true,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: FLAG_NAME_LICENSE,
Aliases: []string{"l"},
Value: false,
DisableDefaultText: true,
Usage: "show licensesa.",
},
},
Action: func(cCtx *cli.Context) error {
// ライセンスフラグが立っていればライセンスを表示して終
if cCtx.Bool(FLAG_NAME_LICENSE) {
fmt.Println(license)
fmt.Println()
fmt.Println(notice)
os.Exit(0)
}
return nil
},
Commands: []*cli.Command{
{
Name: "run",
Usage: "Run container use `docker run`",
UsageText: "devcontainer.vim run [DOCKER_OPTIONS...] [DOCKER_ARGS...]",
HideHelp: true,
SkipFlagParsing: true,
Action: func(cCtx *cli.Context) error {
// `docker run` でコンテナを立てる
// 必要なファイルのダウンロード
vimPath, err := tools.VIM.Install(appCacheDir)
if err != nil {
panic(err)
}
// Requirements のチェック
// 1. docker
isExistsDocker := util.IsExistsCommand("docker")
if !isExistsDocker {
fmt.Fprintf(os.Stderr, "docker not found.")
os.Exit(1)
}
// コンテナ起動
docker.Run(cCtx.Args().Slice(), vimPath)
return nil
},
},
{
Name: "start",
Usage: "Run `devcontainer up` and `devcontainer exec`",
UsageText: "devcontainer.vim start [DEVCONTAINER_OPTIONS...] WORKSPACE_FOLDER",
HideHelp: true,
SkipFlagParsing: true,
Action: func(cCtx *cli.Context) error {
// devcontainer でコンテナを立てる
// 必要なファイルのダウンロード
vimPath, err := tools.VIM.Install(appCacheDir)
if err != nil {
panic(err)
}
devcontainerPath, err := tools.DEVCONTAINER.Install(appCacheDir)
if err != nil {
panic(err)
}
// devcontainer を用いたコンテナ立ち上げ
devcontainer.ExecuteDevcontainer(cCtx.Args().Slice(), devcontainerPath, vimPath)
return nil
},
},
{
Name: "down",
Usage: "Stop and remove devcontainers.",
UsageText: "devcontainer.vim down WORKSPACE_FOLDER",
HideHelp: true,
SkipFlagParsing: true,
Action: func(cCtx *cli.Context) error {
// devcontainer でコンテナを立てる
// 必要なファイルのダウンロード
devcontainerPath, err := tools.DEVCONTAINER.Install(appCacheDir)
if err != nil {
panic(err)
}
// devcontainer を用いたコンテナ終了
devcontainer.Down(cCtx.Args().Slice(), devcontainerPath)
return nil
},
},
},
})
// アプリ実行
err := devcontainerVimArgProcess.Run(os.Args)
if err != nil {
os.Exit(1)
}
}