Skip to content

Instantly share code, notes, and snippets.

@u110
Last active February 7, 2020 03:28
Show Gist options
  • Save u110/67856922cb8e6a502e416c2bef8f17bf to your computer and use it in GitHub Desktop.
Save u110/67856922cb8e6a502e416c2bef8f17bf to your computer and use it in GitHub Desktop.
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()
}
}
}
$ 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
{
"name": "get-current",
"cmd": "sh -c date",
"type": "shell"
}
{
"name": "copy-files-to-remote",
"type": "transfer",
"from": "/tmp/log/*.csv",
"to": "my.remote.host"
}
@u110
Copy link
Author

u110 commented Feb 7, 2020

@u110
Copy link
Author

u110 commented Feb 7, 2020

この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