/
main.go
98 lines (81 loc) 路 2.11 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
// Gedcomq is a command line tool and query language for GEDCOM files heavily
// inspired by jq, in name and syntax.
//
// The basic syntax of the tool is:
//
// gedcomq -gedcom file.ged '.Individuals | .Name'
//
// You can find the full language documentation in the q package:
//
// https://godoc.org/github.com/elliotchance/gedcom/q
package main
import (
"flag"
"github.com/elliotchance/gedcom"
"github.com/elliotchance/gedcom/q"
"github.com/elliotchance/gedcom/util"
"log"
"os"
)
var (
optionGedcomFiles util.CLIStringSlice
optionFormat string
)
func main() {
parseCLIFlags()
parser := q.NewParser()
engine, err := parser.ParseString(flag.Arg(0))
if err != nil {
log.Fatal(err)
}
docs := []*gedcom.Document{}
for _, gedcomFile := range optionGedcomFiles {
doc, err := gedcom.NewDocumentFromGEDCOMFile(gedcomFile)
if err != nil {
log.Fatal(err)
}
docs = append(docs, doc)
}
if len(docs) == 0 {
log.Fatal("you must provide at least one gedcom file")
}
result, err := engine.Evaluate(docs)
if err != nil {
log.Fatal(err)
}
err = output(result)
if err != nil {
log.Fatal(err)
}
}
func output(result interface{}) error {
var formatter q.Formatter
switch optionFormat {
case "json":
formatter = &q.JSONFormatter{os.Stdout}
case "pretty-json":
formatter = &q.PrettyJSONFormatter{os.Stdout}
case "csv":
formatter = &q.CSVFormatter{os.Stdout}
case "gedcom":
formatter = &q.GEDCOMFormatter{os.Stdout}
case "html":
formatter = &q.HTMLFormatter{os.Stdout}
default:
log.Panicf("unsupported format: %s", optionFormat)
}
return formatter.Write(result)
}
func parseCLIFlags() {
flag.Var(&optionGedcomFiles, "gedcom", util.CLIDescription(`
Path to the GEDCOM file. You may specify more than one document by
providing -gedcom with an argument multiple times. You must provide at
least one document.`))
flag.StringVar(&optionFormat, "format", "json", util.CLIDescription(`
Output format, can be one of the following: "json", "pretty-json",
"gedcom" or "csv".`))
flag.Parse()
if optionGedcomFiles.String() == "" {
log.Fatal("you must specify at least one -gedcom file")
}
}