Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0072b34

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

File tree

10 files changed

+98
-21
lines changed

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)

AltStyle によって変換されたページ (->オリジナル) /