Skip to content

Commit 7ae68f0

Browse files
committed
added support for ipv4 addresses as per #10
1 parent 5c35b08 commit 7ae68f0

4 files changed

Lines changed: 72 additions & 14 deletions

File tree

README.md

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![Build Status](https://travis-ci.org/spatialcurrent/go-dfl.svg)](https://travis-ci.org/spatialcurrent/go-dfl) [![GoDoc](https://godoc.org/github.com/spatialcurrent/go-dfl?status.svg)](https://godoc.org/github.com/spatialcurrent/go-dfl)
1+
[![Build Status](https://travis-ci.org/spatialcurrent/go-dfl.svg)](https://travis-ci.org/spatialcurrent/go-dfl) [![Go Report Card](https://goreportcard.com/badge/spatialcurrent/go-dfl)](https://goreportcard.com/report/spatialcurrent/go-dfl) [![GoDoc](https://godoc.org/github.com/spatialcurrent/go-dfl?status.svg)](https://godoc.org/github.com/spatialcurrent/go-dfl) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://github.com/go-spatial/tegola/blob/master/LICENSE.md)
22

33
# go-dfl
44

@@ -43,32 +43,37 @@ With the `-env` flag you can use DFL filters against the current environment.
4343
./dfl -env -f '@SHELL in [/bin/sh, /bin/bash]' && echo "Shell is set to sh or bash"
4444
```
4545

46+
**IP Address Information**
47+
48+
You can use DFL to filter IP addresses.
49+
50+
```
51+
./dfl -verbose -f '@ip in 10.10.0.0/16' ip=10.10.20.22
52+
# returns true as exit code 0
53+
```
54+
4655
**OpenStreetMap**
4756

4857
You can also use DFL to filter OpenStreetMap features.
4958

5059
```
51-
./dfl -verbose -filter '@pop > (10 - 2)' craft=brewery name=Stone pop=10
52-
true
53-
Done in 7.354125ms
60+
./dfl -f '@pop > (10 - 2)' craft=brewery name=Stone pop=10
61+
# returns true as exit code 0
5462
```
5563

5664
```
57-
./dfl -verbose -filter '@craft like "brewery"' craft=brewery name=Stone pop=10
58-
true
59-
Done in 3.44965ms
65+
./dfl -f '@craft like "brewery"' craft=brewery name=Stone pop=10
66+
# returns true as exit code 0
6067
```
6168

6269
```
63-
./dfl -verbose -filter '@craft like "brew%"' craft=brewery name=Stone pop=10
64-
true
65-
Done in 4.159278ms
70+
./dfl -f '@craft like "brew%"' craft=brewery name=Stone pop=10
71+
# returns true as exit code 0
6672
```
6773

6874
```
69-
./dfl -verbose -filter '@craft ilike "Stone%"' craft=brewery name=Atlas pop=10
70-
false
71-
Done in 4.439012ms
75+
./dfl -f '@craft ilike "Stone%"' craft=brewery name=Atlas pop=10
76+
# returns true as exit code 0
7277
```
7378

7479
# Contributing

dfl/In.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package dfl
99

1010
import (
1111
"fmt"
12+
"net"
1213
//"reflect"
1314
"strconv"
1415
"strings"
@@ -49,13 +50,27 @@ func (i In) Evaluate(ctx Context, funcs FunctionMap) (interface{}, error) {
4950
if err != nil {
5051
return false, errors.Wrap(err, "Error evaulating expression "+i.Dfl())
5152
}
52-
lvs := fmt.Sprint(lv)
5353

5454
rv, err := i.Right.Evaluate(ctx, funcs)
5555
if err != nil {
5656
return false, errors.Wrap(err, "Error evaulating expression "+i.Dfl())
5757
}
5858

59+
switch lv.(type) {
60+
case net.IP:
61+
lv_ip := lv.(net.IP)
62+
switch rv.(type) {
63+
case net.IPNet:
64+
rv_net := rv.(net.IPNet)
65+
return rv_net.Contains(lv_ip), nil
66+
case *net.IPNet:
67+
rv_net := rv.(*net.IPNet)
68+
return rv_net.Contains(lv_ip), nil
69+
}
70+
}
71+
72+
lvs := fmt.Sprint(lv)
73+
5974
switch rv.(type) {
6075
case string:
6176
return strings.Contains(rv.(string), lvs), nil

dfl/TryConvertString.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package dfl
99

1010
import (
11+
"net"
1112
"strconv"
1213
"strings"
1314
"time"
@@ -74,5 +75,15 @@ func TryConvertString(s string) interface{} {
7475
return left_time
7576
}
7677

78+
left_ipv4 := net.ParseIP(s)
79+
if left_ipv4 != nil {
80+
return left_ipv4
81+
}
82+
83+
_, left_net, err := net.ParseCIDR(s)
84+
if err == nil {
85+
return left_net
86+
}
87+
7788
return s
7889
}

dfl/TryConvertString_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package dfl
99

1010
import (
11+
"net"
1112
"reflect"
1213
"testing"
1314
"time"
@@ -63,3 +64,29 @@ func TestTryConvertStringTimes(t *testing.T) {
6364
}
6465

6566
}
67+
68+
69+
func TestTryConvertStringIPv4(t *testing.T) {
70+
71+
testCases := []struct {
72+
in string
73+
want interface{}
74+
}{
75+
{in: "192.168.2.1", want: net.ParseIP("192.168.2.1")},
76+
{in: "10.10.1.1", want: net.ParseIP("10.10.1.1")},
77+
}
78+
79+
for _, testCase := range testCases {
80+
got := TryConvertString(testCase.in)
81+
want := testCase.want.(net.IP)
82+
switch got.(type) {
83+
case net.IP:
84+
if !got.(net.IP).Equal(want) {
85+
t.Errorf("TryConvertString(%q) == %v (%q), want %v (%q)", testCase.in, got, reflect.TypeOf(got), testCase.want, reflect.TypeOf(testCase.want))
86+
}
87+
default:
88+
t.Errorf("TryConvertString(%q) == %v (%q), want %v (%q)", testCase.in, got, reflect.TypeOf(got), testCase.want, reflect.TypeOf(testCase.want))
89+
}
90+
}
91+
92+
}

0 commit comments

Comments
 (0)