Skip to content

Commit 0072b34

Browse files
committed
- [+] add -p,--protect option
1 parent 944a5a8 commit 0072b34

10 files changed

+98
-21
lines changed

cmdFmt.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package main
99
import (
1010
"bytes"
1111
"encoding/json"
12-
"io/ioutil"
1312

1413
"github.com/mkideal/cli"
1514
)
@@ -18,14 +17,15 @@ func fmtCLI(ctx *cli.Context) error {
1817
rootArgv = ctx.RootArgv().(*rootT)
1918
argv := ctx.Argv().(*fmtT)
2019
// fmt.Printf("[fmt]:\n %+v\n %+v\n %v\n", rootArgv, argv, ctx.Args())
21-
Opts.Prefix, Opts.Indent, Opts.Compact, Opts.Verbose =
22-
rootArgv.Prefix, rootArgv.Indent, rootArgv.Compact, rootArgv.Verbose.Value()
20+
Opts.Prefix, Opts.Indent, Opts.Compact, Opts.Protect, Opts.Verbose =
21+
rootArgv.Prefix, rootArgv.Indent, rootArgv.Compact,
22+
rootArgv.Protect, rootArgv.Verbose.Value()
2323

24-
data, err := ioutil.ReadAll(argv.Filei)
24+
data := readJson(argv.Filei)
2525
argv.Filei.Close()
26-
abortOn("[::fmt] Reading input", err)
2726

2827
var out bytes.Buffer
28+
var err error
2929
if Opts.Compact {
3030
err = json.Compact(&out, data)
3131
} else {

cmdSort.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"encoding/json"
1111
"fmt"
1212
"io"
13-
"io/ioutil"
1413

1514
"github.com/mkideal/cli"
1615
)
@@ -22,17 +21,18 @@ func sortCLI(ctx *cli.Context) error {
2221
rootArgv = ctx.RootArgv().(*rootT)
2322
argv := ctx.Argv().(*sortT)
2423
//fmt.Printf("[sort]:\n %+v\n %+v\n %v\n", rootArgv, argv, ctx.Args())
25-
Opts.Prefix, Opts.Indent, Opts.Compact, Opts.Verbose =
26-
rootArgv.Prefix, rootArgv.Indent, rootArgv.Compact, rootArgv.Verbose.Value()
24+
Opts.Prefix, Opts.Indent, Opts.Compact, Opts.Protect, Opts.Verbose =
25+
rootArgv.Prefix, rootArgv.Indent, rootArgv.Compact,
26+
rootArgv.Protect, rootArgv.Verbose.Value()
2727
return cmdSort(argv.Filei, argv.Fileo)
2828
}
2929

3030
func cmdSort(r io.Reader, w io.Writer) error {
3131
var res interface{}
32-
content, err := ioutil.ReadAll(r)
33-
abortOn("[::sort] Reading input", err)
32+
content := readJson(r)
3433
json.Unmarshal(content, &res)
3534
var js []byte
35+
var err error
3636
if Opts.Compact {
3737
js, err = json.Marshal(res)
3838
} else {

jsonfiddle_cli.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ Options:
3131
Usage: indent for json string output
3232
Value: ' '
3333

34+
- Name: Protect
35+
Type: bool
36+
Flag: p,protect
37+
Usage: protect {{TEMPLATE}} in JSON data
38+
3439
- Name: Verbose
3540
Type: cli.Counter
3641
Flag: v,verbose

jsonfiddle_cliDef.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type rootT struct {
2222
Compact bool `cli:"c,compact" usage:"Compact JSON data, remove all whitespaces"`
2323
Prefix string `cli:"prefix" usage:"prefix for json string output"`
2424
Indent string `cli:"d,indent" usage:"indent for json string output" dft:" "`
25+
Protect bool `cli:"p,protect" usage:"protect {{TEMPLATE}} in JSON data"`
2526
Verbose cli.Counter `cli:"v,verbose" usage:"Verbose mode (Multiple -v options increase the verbosity.)"`
2627
}
2728

@@ -37,16 +38,31 @@ var root = &cli.Command{
3738
}
3839

3940
// Template for main starts here
41+
////////////////////////////////////////////////////////////////////////////
42+
// Constant and data type/structure definitions
43+
44+
// The OptsT type defines all the configurable options from cli.
45+
// type OptsT struct {
46+
// Compact bool
47+
// Prefix string
48+
// Indent string
49+
// Protect bool
50+
// Verbose cli.Counter
51+
// Verbose int
52+
// }
53+
4054
////////////////////////////////////////////////////////////////////////////
4155
// Global variables definitions
4256

4357
// var (
4458
// progname = "jsonfiddle"
4559
// version = "0.1.0"
46-
// date = "2017-08-14"
47-
// )
60+
// date = "2017-09-09"
4861

49-
// var rootArgv *rootT
62+
// rootArgv *rootT
63+
// // Opts store all the configurable options
64+
// Opts OptsT
65+
// )
5066

5167
////////////////////////////////////////////////////////////////////////////
5268
// Function definitions
@@ -87,6 +103,8 @@ var root = &cli.Command{
87103
// rootArgv = ctx.RootArgv().(*rootT)
88104
// argv := ctx.Argv().(*escT)
89105
// fmt.Printf("[esc]:\n %+v\n %+v\n %v\n", rootArgv, argv, ctx.Args())
106+
// Opts.Compact, Opts.Prefix, Opts.Indent, Opts.Protect, Opts.Verbose, Opts.Verbose =
107+
// rootArgv.Compact, rootArgv.Prefix, rootArgv.Indent, rootArgv.Protect, rootArgv.Verbose, rootArgv.Verbose.Value()
90108
// return nil
91109
// }
92110

@@ -112,6 +130,8 @@ var escDef = &cli.Command{
112130
// rootArgv = ctx.RootArgv().(*rootT)
113131
// argv := ctx.Argv().(*fmtT)
114132
// fmt.Printf("[fmt]:\n %+v\n %+v\n %v\n", rootArgv, argv, ctx.Args())
133+
// Opts.Compact, Opts.Prefix, Opts.Indent, Opts.Protect, Opts.Verbose, Opts.Verbose =
134+
// rootArgv.Compact, rootArgv.Prefix, rootArgv.Indent, rootArgv.Protect, rootArgv.Verbose, rootArgv.Verbose.Value()
115135
// return nil
116136
// }
117137

@@ -137,6 +157,8 @@ var fmtDef = &cli.Command{
137157
// rootArgv = ctx.RootArgv().(*rootT)
138158
// argv := ctx.Argv().(*sortT)
139159
// fmt.Printf("[sort]:\n %+v\n %+v\n %v\n", rootArgv, argv, ctx.Args())
160+
// Opts.Compact, Opts.Prefix, Opts.Indent, Opts.Protect, Opts.Verbose, Opts.Verbose =
161+
// rootArgv.Compact, rootArgv.Prefix, rootArgv.Indent, rootArgv.Protect, rootArgv.Verbose, rootArgv.Verbose.Value()
140162
// return nil
141163
// }
142164

@@ -162,6 +184,8 @@ var sortDef = &cli.Command{
162184
// rootArgv = ctx.RootArgv().(*rootT)
163185
// argv := ctx.Argv().(*j2sT)
164186
// fmt.Printf("[j2s]:\n %+v\n %+v\n %v\n", rootArgv, argv, ctx.Args())
187+
// Opts.Compact, Opts.Prefix, Opts.Indent, Opts.Protect, Opts.Verbose, Opts.Verbose =
188+
// rootArgv.Compact, rootArgv.Prefix, rootArgv.Indent, rootArgv.Protect, rootArgv.Verbose, rootArgv.Verbose.Value()
165189
// return nil
166190
// }
167191

jsonfiddle_main.go

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ package main
1010

1111
import (
1212
"fmt"
13+
"io"
14+
"io/ioutil"
1315
"os"
16+
"regexp"
1417
"strings"
1518

1619
"github.com/mkideal/cli"
@@ -24,6 +27,7 @@ type OptsT struct {
2427
Prefix string
2528
Indent string
2629
Compact bool
30+
Protect bool
2731
Verbose int
2832
}
2933

@@ -33,8 +37,8 @@ type OptsT struct {
3337
var (
3438
progname = "jsonfiddle"
3539
// version tracks the release version.
36-
version = "v0.3.0"
37-
date = "2017-08-16"
40+
version = "v0.4.0"
41+
date = "2017-09-09"
3842
)
3943

4044
var (
@@ -74,6 +78,22 @@ func jsonfiddle(ctx *cli.Context) error {
7478
//==========================================================================
7579
// support functions
7680

81+
// Basename returns the file name without extension.
82+
func readJson(r io.Reader) []byte {
83+
data, err := ioutil.ReadAll(r)
84+
abortOn("Reading json input", err)
85+
86+
if Opts.Protect {
87+
data = regexp.MustCompile(`({{)([^ }]+)(}})`).
88+
ReplaceAll(data, []byte(`<<${2}>>`))
89+
// "age":<<C_age>> => "age":"<<C_age>>"
90+
data = regexp.MustCompile(`(:)(<<[^>]+>>)([]},])`).
91+
ReplaceAll(data, []byte(`${1}"${2}"${3}`))
92+
}
93+
verbose(2, "%s", string(data))
94+
return data
95+
}
96+
7797
// Basename returns the file name without extension.
7898
func Basename(s string) string {
7999
n := strings.LastIndexByte(s, '.')
@@ -92,8 +112,8 @@ func abortOn(errCase string, e error) {
92112
}
93113

94114
// verbose will print info to stderr according to the verbose level setting
95-
func verbose(levelSet, levelNow int, format string, args ...interface{}) {
96-
if levelNow >= levelSet {
115+
func verbose(levelSet int, format string, args ...interface{}) {
116+
if Opts.Verbose >= levelSet {
97117
fmt.Fprintf(os.Stderr, "["+progname+"] "+format+"\n", args...)
98118
}
99119
}

jsonfiddle_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,23 @@ func TestExec(t *testing.T) {
6262

6363
// == Test Basic Functions
6464
// -- fmt
65+
t.Logf("\n\n== Testing Basic fmt Functions\n\n")
6566
testIt(t, "CustomerC", "fmt", "-c", "-i", "Customer.json")
6667
testIt(t, "Customer", "fmt", "-i", "Customer.json")
6768
testIt(t, "Schedules", "fmt", "-i", "Schedules.json")
69+
testIt(t, "CustomerP", "fmt", "-p", "-i", "CustomerP.json")
70+
testIt(t, "CustomerPC", "fmt", "-c", "-p", "-i", "CustomerP.json")
6871
// -- sort
72+
t.Logf("\n\n== Testing Basic sort Functions\n\n")
6973
testIt(t, "CustomerSI", "sort", "-i", "Customer.json")
7074
testIt(t, "CustomerSC", "sort", "-c", "-i", "Customer.json")
75+
testIt(t, "CustomerPS", "sort", "-p", "-i", "CustomerP.json")
7176
testIt(t, "SchedulesSI", "sort", "-i", "Schedules.json")
7277
// -- j2s
78+
t.Logf("\n\n== Testing Basic j2s Functions\n\n")
7379
testIt(t, "CustomerJ2S", "j2s", "-i", "Customer.json")
7480
testIt(t, "GoodsJ2S", "j2s", "-i", "Goods.json")
7581
testIt(t, "MenuItemsJ2S", "j2s", "-i", "MenuItems.json")
7682
testIt(t, "SmartyStreetsJ2S", "j2s", "-i", "SmartyStreets.json")
7783
testIt(t, "SchedulesJ2S", "j2s", "-i", "Schedules.json")
78-
79-
//Test String Functions
80-
81-
//Test Bigger files
8284
}

test/CustomerP.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"firstName":"{{C_firstName}}","lastName":"{{C_lastName}}","age":{{C_age}},"address":{"streetAddress":"{{C_address1}}","city":"{{C_city}}","state":"NY","postalCode":"10021"}}

test/CustomerP.ref

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"firstName": "<<C_firstName>>",
3+
"lastName": "<<C_lastName>>",
4+
"age": "<<C_age>>",
5+
"address": {
6+
"streetAddress": "<<C_address1>>",
7+
"city": "<<C_city>>",
8+
"state": "NY",
9+
"postalCode": "10021"
10+
}
11+
}
12+

test/CustomerPC.ref

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"firstName":"<<C_firstName>>","lastName":"<<C_lastName>>","age":"<<C_age>>","address":{"streetAddress":"<<C_address1>>","city":"<<C_city>>","state":"NY","postalCode":"10021"}}

test/CustomerPS.ref

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"address": {
3+
"city": "\u003c\u003cC_city\u003e\u003e",
4+
"postalCode": "10021",
5+
"state": "NY",
6+
"streetAddress": "\u003c\u003cC_address1\u003e\u003e"
7+
},
8+
"age": "\u003c\u003cC_age\u003e\u003e",
9+
"firstName": "\u003c\u003cC_firstName\u003e\u003e",
10+
"lastName": "\u003c\u003cC_lastName\u003e\u003e"
11+
}
12+

0 commit comments

Comments
 (0)