Skip to content

Commit

Permalink
Add the -v2 flag to try out the new API
Browse files Browse the repository at this point in the history
  • Loading branch information
josephburnett committed Jul 24, 2024
1 parent 17354e1 commit 6a3563e
Showing 1 changed file with 186 additions and 5 deletions.
191 changes: 186 additions & 5 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"strings"

jd "github.com/josephburnett/jd/lib"
v2 "github.com/josephburnett/jd/v2"
"github.com/josephburnett/jd/web/serve"
)

Expand All @@ -30,6 +31,7 @@ var (
setkeys = flag.String("setkeys", "", "Keys to identify set objects")
translate = flag.String("t", "", "Translate mode")
ver = flag.Bool("version", false, "Print version and exit")
libv2 = flag.Bool("v2", false, "Use the jd v2 library")
yaml = flag.Bool("yaml", false, "Read and write YAML")
)

Expand All @@ -49,11 +51,23 @@ func main() {
}
return
}
metadata, err := parseMetadata()
var (
metadata []jd.Metadata
options []v2.Option
err error
)
if *libv2 {
options, err = parseMetadataV2()
} else {
metadata, err = parseMetadata()
}
if err != nil {
errorAndExit(err.Error())
}
if *gitDiffDriver {
if *libv2 {
errorAndExit("--git-diff-driver cannot be used with --v2 yet")
}
err := printGitDiffDriver(metadata)
if err != nil {
errorAndExit(err.Error())
Expand Down Expand Up @@ -96,11 +110,19 @@ func main() {
}
switch mode {
case diffMode:
printDiff(a, b, metadata)
if *libv2 {
printDiffV2(a, b, options)
} else {
printDiff(a, b, metadata)
}
case patchMode:
printPatch(a, b, metadata)
if *libv2 {
printPatchV2(a, b, options)
} else {
printPatch(a, b, metadata)
}
case translateMode:
printTranslation(a, metadata)
printTranslation(a)
}
}

Expand Down Expand Up @@ -151,6 +173,38 @@ func parseMetadata() ([]jd.Metadata, error) {
return metadata, nil
}

func parseMetadataV2() ([]v2.Option, error) {
if *precision != 0.0 {
errorAndExit("--precision cannot be used with --v2 yet")
}
if *precision != 0.0 && (*set || *mset) {
return nil, fmt.Errorf("-precision cannot be used with -set or -mset because they use hashcodes")
}
options := make([]v2.Option, 0)
if *set {
options = append(options, v2.SET)
}
if *mset {
options = append(options, v2.MULTISET)
}
if *setkeys != "" {
keys := make([]string, 0)
ks := strings.Split(*setkeys, ",")
for _, k := range ks {
trimmed := strings.TrimSpace(k)
if trimmed == "" {
return nil, fmt.Errorf("invalid set key: %v", k)
}
keys = append(keys, trimmed)
}
options = append(options, v2.SetKeys(keys...))
}
if *format == "merge" {
options = append(options, v2.MERGE)
}
return options, nil
}

func printUsageAndExit() {
for _, line := range []string{
``,
Expand Down Expand Up @@ -178,6 +232,7 @@ func printUsageAndExit() {
` "patch" (RFC 6902), "merge" (RFC 7386), "json" and "yaml".`,
` FORMATS are provided as a pair separated by "2". E.g.`,
` "yaml2json" or "jd2patch".`,
` -v2 Use the JD v2 library and format.`,
``,
`Examples:`,
` jd a.json b.json`,
Expand Down Expand Up @@ -215,6 +270,26 @@ func printDiff(a, b string, metadata []jd.Metadata) {
}
}

func printDiffV2(a, b string, options []v2.Option) {
str, err := diffV2(a, b, options)
if err != nil {
errorAndExit(err.Error())
}
if *output == "" {
if str == "" {
os.Exit(0)
}
fmt.Print(str)
os.Exit(1)
} else {
if str == "" {
os.Exit(0)
}
ioutil.WriteFile(*output, []byte(str), 0644)
os.Exit(1)
}
}

func printGitDiffDriver(metadata []jd.Metadata) error {
if len(flag.Args()) != 7 {
return fmt.Errorf("Git diff driver expects exactly 7 arguments.")
Expand Down Expand Up @@ -274,6 +349,50 @@ func diff(a, b string, metadata []jd.Metadata) (string, error) {
return str, nil
}

func diffV2(a, b string, options []v2.Option) (string, error) {
var aNode, bNode v2.JsonNode
var err error
if *yaml {
aNode, err = v2.ReadYamlString(a)
} else {
aNode, err = v2.ReadJsonString(a)
}
if err != nil {
return "", err
}
if *yaml {
bNode, err = v2.ReadYamlString(b)
} else {
bNode, err = v2.ReadJsonString(b)
}
if err != nil {
return "", err
}
diff := aNode.Diff(bNode, options...)
var renderOptions []v2.Option
if *color {
renderOptions = append(renderOptions, v2.COLOR)
}
var str string
switch *format {
case "", "jd":
str = diff.Render(renderOptions...)
case "patch":
str, err = diff.RenderPatch()
if err != nil {
return "", err
}
case "merge":
str, err = diff.RenderMerge()
if err != nil {
return "", err
}
default:
return "", fmt.Errorf("Invalid format: %q", *format)
}
return str, nil
}

func printPatch(p, a string, metadata []jd.Metadata) {
var diff jd.Diff
var err error
Expand Down Expand Up @@ -324,10 +443,63 @@ func printPatch(p, a string, metadata []jd.Metadata) {
}
}

func printTranslation(a string, metadata []jd.Metadata) {
func printPatchV2(p, a string, options []v2.Option) {
var diff v2.Diff
var err error
switch *format {
case "", "jd":
diff, err = v2.ReadDiffString(p)
case "patch":
diff, err = v2.ReadPatchString(p)
case "merge":
diff, err = v2.ReadMergeString(p)
default:
errorAndExit(fmt.Sprintf("Invalid format: %q", *format))
}
if err != nil {
errorAndExit(err.Error())
}
var aNode v2.JsonNode
if *yaml {
aNode, err = v2.ReadYamlString(a)
} else {
aNode, err = v2.ReadJsonString(a)
}
if err != nil {
errorAndExit(err.Error())
}
bNode, err := aNode.Patch(diff)
if err != nil {
errorAndExit(err.Error())
}
var out string
if *yaml {
out = bNode.Yaml(options...)
} else {
out = bNode.Json(options...)
}
if *output == "" {
if out == "" {
os.Exit(0)
}
fmt.Print(out)
os.Exit(1)
} else {
if out == "" {
os.Exit(0)
}
ioutil.WriteFile(*output, []byte(out), 0644)
os.Exit(1)
}
}

func printTranslation(a string) {
var out string
switch *translate {
case "jd2patch":
if *libv2 {
errorAndExit("jd2patch translation cannot be used with --v2 yet")
}
diff, err := jd.ReadDiffString(a)
if err != nil {
errorAndExit(err.Error())
Expand All @@ -337,12 +509,18 @@ func printTranslation(a string, metadata []jd.Metadata) {
errorAndExit(err.Error())
}
case "patch2jd":
if *libv2 {
errorAndExit("patch2jd translation cannot be used with --v2 yet")
}
patch, err := jd.ReadPatchString(a)
if err != nil {
errorAndExit(err.Error())
}
out = patch.Render()
case "jd2merge":
if *libv2 {
errorAndExit("jd2merge translation cannot be used with --v2 yet")
}
diff, err := jd.ReadDiffString(a)
if err != nil {
errorAndExit(err.Error())
Expand All @@ -352,6 +530,9 @@ func printTranslation(a string, metadata []jd.Metadata) {
errorAndExit(err.Error())
}
case "merge2jd":
if *libv2 {
errorAndExit("merge2jd translation cannot be used with --v2 yet")
}
patch, err := jd.ReadMergeString(a)
if err != nil {
errorAndExit(err.Error())
Expand Down

0 comments on commit 6a3563e

Please sign in to comment.