-
Notifications
You must be signed in to change notification settings - Fork 0
/
gpsbabel.go
110 lines (84 loc) · 1.72 KB
/
gpsbabel.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
package gpsbabel
import (
"errors"
"fmt"
"io"
"os"
"os/exec"
"github.com/dsoprea/go-logging"
)
const (
FormatGpx = "gpx"
)
var (
BabelCommandFilepath = "gpsbabel"
)
var (
ErrConversionFailed = errors.New("conversion failed")
)
func SetBabelFilepath(filepath string) {
BabelCommandFilepath = filepath
}
type Babel struct {
fromFormat string
toFormat string
}
func NewBabel(fromFormat, toFormat string) *Babel {
return &Babel{
fromFormat: fromFormat,
toFormat: toFormat,
}
}
func (b *Babel) Convert(r io.Reader, w io.Writer) (err error) {
defer func() {
if state := recover(); state != nil {
err = log.Wrap(state.(error))
}
}()
parameters := []string{
"-i", b.fromFormat,
"-f", "/dev/stdin",
"-o", b.toFormat,
"-F", "-",
}
cmd := exec.Command(BabelCommandFilepath, parameters...)
cmd.Stdin = r
cmd.Stdout = w
err = cmd.Run()
if err != nil {
if ee, ok := err.(*exec.ExitError); ok == true {
fmt.Printf("STDERR:\n\n%s\n", string(ee.Stderr))
log.Panic(ErrConversionFailed)
}
log.Panic(err)
}
return nil
}
func Convert(fromFormat, toFormat string, r io.Reader, w io.Writer) (err error) {
defer func() {
if state := recover(); state != nil {
err = log.Wrap(state.(error))
}
}()
b := NewBabel(fromFormat, toFormat)
err = b.Convert(r, w)
log.PanicIf(err)
return nil
}
func ConvertToGpx(fromFormat string, r io.Reader, w io.Writer) (err error) {
defer func() {
if state := recover(); state != nil {
err = log.Wrap(state.(error))
}
}()
b := NewBabel(fromFormat, FormatGpx)
err = b.Convert(r, w)
log.PanicIf(err)
return nil
}
func init() {
commandFilepath := os.Getenv("GPSBABEL_FILEPATH")
if commandFilepath != "" {
BabelCommandFilepath = commandFilepath
}
}