diff --git a/README.md b/README.md index d07c3e3..e9075e2 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Json Incremental Digger It's very simple tool. You can drill down interactively by using filtering queries like [jq](https://stedolan.github.io/jq/). +**Suggestion** and **Auto completion** of this tool will provide you very comfotable JSON drill down. + ## Demo ![demo-jid-main](https://github.com/simeji/jid/wiki/images/demo-jid-main-640.gif) @@ -44,6 +46,7 @@ go get github.com/stretchr/testify/assert * [simple json example](#simple-json-example) * [simple json example2](#simple-json-example2) +* [with initial query](#with-initial-query) * [with curl](#with-curl) #### simple json example @@ -77,6 +80,13 @@ This json is used by [demo section](https://github.com/simeji/jid#demo). echo '{"info":{"date":"2016-10-23","version":1.0},"users":[{"name":"simeji","uri":"https://github.com/simeji","id":1},{"name":"simeji2","uri":"https://example.com/simeji","id":2},{"name":"simeji3","uri":"https://example.com/simeji3","id":3}],"userCount":3}}'|jid ``` +#### With initial query + +First argument of `jid` is initial query. +(Use JSON same as [Demo](#demo)) + +![demo-jid-with-query](https://github.com/simeji/jid/wiki/images/demo-jid-with-query-640.gif) + #### with curl Sample for using [RDAP](https://datatracker.ietf.org/wg/weirds/documents/) data. @@ -101,4 +111,6 @@ curl -s http://rdg.afilias.info/rdap/domain/example.info | jid ### Option +First argument: Initial query + -q : Print query (for jq) diff --git a/cmd/jid/jid.go b/cmd/jid/jid.go index 19c3bc8..fb3e1a9 100644 --- a/cmd/jid/jid.go +++ b/cmd/jid/jid.go @@ -11,27 +11,33 @@ import ( func main() { content := os.Stdin - var query bool + var qm bool + qs := "." - flag.BoolVar(&query, "q", false, "output query") + flag.BoolVar(&qm, "q", false, "Output query mode") flag.Parse() - e, err := jid.NewEngine(content) + args := flag.Args() + if len(args) > 0 { + qs = args[0] + } + + e, err := jid.NewEngine(content, qs) if err != nil { fmt.Println(err) os.Exit(1) } - os.Exit(run(e, query)) + os.Exit(run(e, qm)) } -func run(e jid.EngineInterface, query bool) int { +func run(e jid.EngineInterface, qm bool) int { result := e.Run() if result.GetError() != nil { return 2 } - if query { + if qm { fmt.Printf("%s", result.GetQueryString()) } else { fmt.Printf("%s", result.GetContent()) diff --git a/cmd/jid/jid_test.go b/cmd/jid/jid_test.go index e5dfec0..cf3c403 100644 --- a/cmd/jid/jid_test.go +++ b/cmd/jid/jid_test.go @@ -2,10 +2,11 @@ package main import ( "fmt" - "github.com/simeji/jid" - "github.com/stretchr/testify/assert" "os" "testing" + + "github.com/simeji/jid" + "github.com/stretchr/testify/assert" ) var called int = 0 @@ -16,7 +17,7 @@ func TestMain(m *testing.M) { defer os.Exit(code) } -func TestjidRun(t *testing.T) { +func TestJidRun(t *testing.T) { var assert = assert.New(t) e := &EngineMock{err: nil} @@ -31,7 +32,7 @@ func TestjidRun(t *testing.T) { assert.Zero(result) } -func TestjidRunWithError(t *testing.T) { +func TestJidRunWithError(t *testing.T) { called = 0 var assert = assert.New(t) e := &EngineMock{err: fmt.Errorf("")} diff --git a/engine.go b/engine.go index 8a63f8f..53e3bd2 100644 --- a/engine.go +++ b/engine.go @@ -37,7 +37,7 @@ type Engine struct { cursorOffsetX int } -func NewEngine(s io.Reader) (EngineInterface, error) { +func NewEngine(s io.Reader, qs string) (EngineInterface, error) { j, err := NewJsonManager(s) if err != nil { return nil, err @@ -45,7 +45,7 @@ func NewEngine(s io.Reader) (EngineInterface, error) { e := &Engine{ manager: j, term: NewTerminal(FilterPrompt, DefaultY), - query: NewQuery([]rune("")), + query: NewQuery([]rune(qs)), complete: []string{"", ""}, keymode: false, candidates: []string{}, @@ -55,6 +55,7 @@ func NewEngine(s io.Reader) (EngineInterface, error) { queryConfirm: false, cursorOffsetX: 0, } + e.cursorOffsetX = len(e.query.Get()) return e, nil } diff --git a/engine_test.go b/engine_test.go index cda52ad..7f45917 100644 --- a/engine_test.go +++ b/engine_test.go @@ -12,17 +12,34 @@ func TestNewEngine(t *testing.T) { var assert = assert.New(t) f, _ := os.Create("/dev/null") - e, err := NewEngine(f) + e, err := NewEngine(f, "") assert.Nil(e) assert.NotNil(err) - ee := getEngine(`{"name":"go"}`) + ee := getEngine(`{"name":"go"}`, "") assert.NotNil(ee) + assert.Equal("", ee.query.StringGet()) + assert.Equal(0, ee.cursorOffsetX) +} + +func TestNewEngineWithQuery(t *testing.T) { + var assert = assert.New(t) + e := getEngine(`{"name":"go"}`, ".nam") + assert.Equal(".nam", e.query.StringGet()) + assert.Equal(4, e.cursorOffsetX) + + e = getEngine(`{"name":"go"}`, "nam") + assert.Equal("", e.query.StringGet()) + assert.Equal(0, e.cursorOffsetX) + + e = getEngine(`{"name":"go"}`, ".nam..") + assert.Equal("", e.query.StringGet()) + assert.Equal(0, e.cursorOffsetX) } func TestDeleteChar(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go"}`) + e := getEngine(`{"name":"go"}`, "") e.query.StringSet(".name") e.cursorOffsetX = 5 @@ -33,7 +50,7 @@ func TestDeleteChar(t *testing.T) { func TestDeleteWordBackward(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go"}`) + e := getEngine(`{"name":"go"}`, "") e.query.StringSet(".name") e.deleteWordBackward() @@ -53,7 +70,7 @@ func TestDeleteWordBackward(t *testing.T) { func TestScrollToAbove(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"named":"go","NameTest":[1,2,3]}`) + e := getEngine(`{"named":"go","NameTest":[1,2,3]}`, "") assert.Equal(0, e.contentOffset) e.scrollToAbove() assert.Equal(0, e.contentOffset) @@ -66,7 +83,7 @@ func TestScrollToAbove(t *testing.T) { func TestScrollToBelow(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"named":"go","NameTest":[1,2,3]}`) + e := getEngine(`{"named":"go","NameTest":[1,2,3]}`, "") e.scrollToBelow() assert.Equal(1, e.contentOffset) e.scrollToBelow() @@ -77,13 +94,13 @@ func TestScrollToBelow(t *testing.T) { func TestGetContents(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go"}`) + e := getEngine(`{"name":"go"}`, "") c := e.getContents() assert.Equal([]string{`{`, ` "name": "go"`, "}"}, c) assert.Equal([]string{}, e.candidates) assert.Equal([]string{"", ""}, e.complete) - e = getEngine(`{"name":"go", "naming":"simeji", "foo":"bar"}`) + e = getEngine(`{"name":"go", "naming":"simeji", "foo":"bar"}`, "") e.query.StringSet(".n") c = e.getContents() assert.Equal([]string{`{`, ` "foo": "bar",`, ` "name": "go",`, ` "naming": "simeji"`, "}"}, c) @@ -99,7 +116,7 @@ func TestGetContents(t *testing.T) { func TestSetCandidateData(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go"}`) + e := getEngine(`{"name":"go"}`, "") // case 1 e.candidates = []string{"test", "testing"} @@ -160,7 +177,7 @@ func TestSetCandidateData(t *testing.T) { func TestConfirmCandidate(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go","NameTest":[1,2,3]}`) + e := getEngine(`{"name":"go","NameTest":[1,2,3]}`, "") e.query.StringSet(".") e.queryConfirm = false e.candidates = []string{"test", "testing", "foo"} @@ -178,7 +195,7 @@ func TestConfirmCandidate(t *testing.T) { assert.True(e.queryConfirm) assert.Equal(4, e.cursorOffsetX) - e = getEngine(`{"name":"go"}`) + e = getEngine(`{"name":"go"}`, "") e.query.StringSet(".name.hoge") e.candidates = []string{"aaa", "bbb", "ccc"} e.candidateidx = 1 @@ -191,7 +208,7 @@ func TestConfirmCandidate(t *testing.T) { func TestCtrllAction(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go","NameTest":[1,2,3]}`) + e := getEngine(`{"name":"go","NameTest":[1,2,3]}`, "") assert.False(e.keymode) e.toggleKeymode() assert.True(e.keymode) @@ -201,7 +218,7 @@ func TestCtrllAction(t *testing.T) { func TestTabAction(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go","NameTest":[1,2,3]}`) + e := getEngine(`{"name":"go","NameTest":[1,2,3]}`, "") e.query.StringSet(".namet") e.complete = []string{"est", "NameTest"} @@ -222,7 +239,7 @@ func TestTabAction(t *testing.T) { func TestEscAction(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go","NameTest":[1,2,3]}`) + e := getEngine(`{"name":"go","NameTest":[1,2,3]}`, "") assert.False(e.candidatemode) e.escapeCandidateMode() assert.False(e.candidatemode) @@ -233,7 +250,7 @@ func TestEscAction(t *testing.T) { func TestInputChar(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"go"}`) + e := getEngine(`{"name":"go"}`, "") e.query.StringSet(".name") e.cursorOffsetX = len(e.query.Get()) assert.Equal(5, e.cursorOffsetX) @@ -249,7 +266,7 @@ func TestInputChar(t *testing.T) { func TestMoveCursorForwardAndBackward(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"simeji"}`) + e := getEngine(`{"name":"simeji"}`, "") e.query.StringSet(".ne") e.cursorOffsetX = 0 @@ -274,7 +291,7 @@ func TestMoveCursorForwardAndBackward(t *testing.T) { func TestMoveCursorToTopAndEnd(t *testing.T) { var assert = assert.New(t) - e := getEngine(`{"name":"simeji"}`) + e := getEngine(`{"name":"simeji"}`, "") e.query.StringSet(".ne") e.cursorOffsetX = 2 @@ -285,9 +302,9 @@ func TestMoveCursorToTopAndEnd(t *testing.T) { assert.Equal(3, e.cursorOffsetX) } -func getEngine(j string) *Engine { +func getEngine(j string, qs string) *Engine { r := bytes.NewBufferString(j) - e, _ := NewEngine(r) + e, _ := NewEngine(r, qs) ee := e.(*Engine) return ee }