├── Readme.md └── main.go /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | ## filter(1) 3 | 4 | Filter JSON streams using javascript. 5 | 6 | ```bash 7 | $ echo '{"event":true}{"event":1}{}' | filter "if (j.event) return j" 8 | {"event":true} 9 | {"event":1} 10 | ``` 11 | 12 | ## Installation 13 | 14 | ```bash 15 | $ go get github.com/segmentio/filter 16 | ``` 17 | 18 | ## Usage 19 | 20 | ```bash 21 | Usage: 22 | filter 23 | 24 | filter -h | --help 25 | filter -v | --version 26 | 27 | Options: 28 | -h, --help show help information 29 | -v, --version show version information 30 | ``` 31 | 32 | ## License 33 | 34 | MIT -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/robertkrimen/otto" 4 | import "github.com/tj/docopt" 5 | import "encoding/json" 6 | import "io" 7 | import "os" 8 | 9 | // Version. 10 | var Version = "0.0.1" 11 | 12 | // Usage. 13 | var Usage = ` 14 | Usage: 15 | filter 16 | 17 | filter -h | --help 18 | filter -v | --version 19 | 20 | Options: 21 | -h, --help show help information 22 | -v, --version show version information 23 | 24 | ` 25 | 26 | func main() { 27 | args, err := docopt.Parse(Usage, nil, true, Version, false) 28 | check(err) 29 | 30 | js := args[""].(string) 31 | fn := "(function(){ " + js + " })()" 32 | vm := otto.New() 33 | 34 | dec := json.NewDecoder(os.Stdin) 35 | enc := json.NewEncoder(os.Stdout) 36 | 37 | for { 38 | var v interface{} 39 | err := dec.Decode(&v) 40 | 41 | if err == io.EOF { 42 | return 43 | } 44 | 45 | check(err) 46 | 47 | vm.Set("j", v) 48 | val, err := vm.Run(fn) 49 | check(err) 50 | 51 | if val.IsDefined() { 52 | v, err := val.Export() 53 | check(err) 54 | enc.Encode(v) 55 | } 56 | } 57 | } 58 | 59 | func check(err error) { 60 | if err != nil { 61 | println("filter: " + err.Error()) 62 | os.Exit(1) 63 | } 64 | } 65 | --------------------------------------------------------------------------------