Last active
February 7, 2020 03:28
-
-
Save u110/67856922cb8e6a502e416c2bef8f17bf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"encoding/json" | |
"errors" | |
"io/ioutil" | |
"log" | |
) | |
type Runner interface { | |
Run() | |
} | |
type BaseJob struct { | |
Name string `json:name` | |
Type string `json:type` | |
} | |
type ShellJob struct { | |
Name string `json:name` | |
Type string `json:type` | |
Cmd string `json:grade` | |
} | |
func (j *ShellJob) Run() { | |
log.Println("[ShellJob] command:", j.Cmd) | |
} | |
type TransferJob struct { | |
Name string `json:name` | |
Type string `json:type` | |
From string `json:from` | |
To string `json:to` | |
} | |
func (j *TransferJob) Run() { | |
log.Println("[TransferJob] from:", j.From, "to:", j.To) | |
} | |
func parseRunner(filepath string) (Runner, error) { | |
fbytes, err := ioutil.ReadFile(filepath) | |
if err != nil { | |
return nil, err | |
} | |
var base BaseJob | |
json.Unmarshal(fbytes, &base) | |
log.Println("type:", base.Type) | |
var result Runner | |
switch base.Type { | |
case "shell": | |
var job ShellJob | |
json.Unmarshal(fbytes, &job) | |
result = &job | |
case "transfer": | |
var job TransferJob | |
json.Unmarshal(fbytes, &job) | |
result = &job | |
default: | |
return nil, errors.New("not matched. file: " + string(fbytes)) | |
} | |
return result, nil | |
} | |
func main() { | |
log.Println("vim-go") | |
targets := []string{ | |
"./hoge.json", | |
"./shell.json", | |
"./transfer.json", | |
} | |
for _, filepath := range targets { | |
runner, err := parseRunner(filepath) | |
if err != nil { | |
log.Println("[parseRunner err]", err) | |
} else { | |
runner.Run() | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ go run bind.go | |
2020/02/07 12:16:54 vim-go | |
2020/02/07 12:16:54 [parseRunner err] open ./hoge.json: no such file or directory | |
2020/02/07 12:16:54 type: shell | |
2020/02/07 12:16:54 [ShellJob] command: sh -c date | |
2020/02/07 12:16:54 type: transfer | |
2020/02/07 12:16:54 [TransferJob] from: /tmp/log/*.csv to: my.remote.host |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "get-current", | |
"cmd": "sh -c date", | |
"type": "shell" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "copy-files-to-remote", | |
"type": "transfer", | |
"from": "/tmp/log/*.csv", | |
"to": "my.remote.host" | |
} |
このgistを書いたモチベーション
Web API叩いたときに帰ってくる結果の構成が変わるときに、
reflectionとかつかわないといけないかな(面倒なのでつかいたくない)と思ってた。
が、各json間で、共通部分(↑だと、name, type)だけもつstructでbindして判別するなどできることがわかった。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://golang.org/pkg/encoding/json/