Skip to content

Commit d0a84d2

Browse files
authored
Support excluding regexes (#68)
* support exclude of regexes (basic lvl) * different approacj to expr creation * minor rename * drop redundant interface * add simple tests for expr
1 parent cc7f14d commit d0a84d2

File tree

20 files changed

+369
-143
lines changed

20 files changed

+369
-143
lines changed

benchmarks/gnetcli/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,12 @@ func (m DevConf) Make() (*genericcli.GenericCLI, error) {
133133
if err != nil {
134134
return nil, fmt.Errorf("pager expression error %w", err)
135135
}
136-
opts = append(opts, genericcli.WithPager(expr.NewSimpleExprLast200(m.PagerExpression)))
136+
opts = append(opts, genericcli.WithPager(expr.NewSimpleExprLast200().FromPattern(m.PagerExpression)))
137137
}
138138

139139
cli := genericcli.MakeGenericCLI(
140-
expr.NewSimpleExprLast200(m.PromptExpression),
141-
expr.NewSimpleExprLast200(errorExpr),
140+
expr.NewSimpleExprLast200().FromPattern(m.PromptExpression),
141+
expr.NewSimpleExprLast200().FromPattern(errorExpr),
142142
opts...,
143143
)
144144
return &cli, nil

docs/architecture.md

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -253,18 +253,17 @@ const (
253253
```
254254

255255
To create Device implementation, you need to define a constructor function that combines a Connector and a set of CLI templates:
256-
257256
```go
258257
func NewHuaweiDevice(connector streamer.Connector) GenericDevice {
259-
cli := MakeGenericCLI(expr.NewSimpleExpr(huaweiPromptExpression), expr.NewSimpleExpr(huaweiErrorExpression),
258+
cli := MakeGenericCLI(expr.NewSimpleExpr().FromPattern(huaweiPromptExpression), expr.NewSimpleExpr().FromPattern(huaweiErrorExpression),
260259
WithLoginExprs(
261-
expr.NewSimpleExpr(huaweiLoginExpression),
262-
expr.NewSimpleExpr(huaweiPasswordExpression),
263-
expr.NewSimpleExpr(huaweiPasswordErrorExpression)),
260+
expr.NewSimpleExpr().FromPattern(huaweiLoginExpression),
261+
expr.NewSimpleExpr().FromPattern(huaweiPasswordExpression),
262+
expr.NewSimpleExpr().FromPattern(huaweiPasswordErrorExpression)),
264263
WithPager(
265-
expr.NewSimpleExpr(huaweiPagerExpression)),
264+
expr.NewSimpleExpr().FromPattern(huaweiPagerExpression)),
266265
WithQuestion(
267-
expr.NewSimpleExpr(huaweiQuestionExpression)),
266+
expr.NewSimpleExpr().FromPattern(huaweiQuestionExpression)),
268267
)
269268
return MakeGenericDevice(cli, connector)
270269
}
@@ -409,13 +408,13 @@ const (
409408

410409
func NewDevice(connector streamer.Connector, opts ...genericcli.GenericDeviceOption) genericcli.GenericDevice {
411410
cli := genericcli.MakeGenericCLI(
412-
expr.NewSimpleExpr(promptExpression),
413-
expr.NewSimpleExpr(errorExpression),
411+
expr.NewSimpleExpr().FromPattern(promptExpression),
412+
expr.NewSimpleExpr().FromPattern(errorExpression),
414413
genericcli.WithPager(
415-
expr.NewSimpleExpr(pagerExpression),
414+
expr.NewSimpleExpr().FromPattern(pagerExpression),
416415
),
417416
genericcli.WithQuestion(
418-
expr.NewSimpleExpr(questionExpression),
417+
expr.NewSimpleExpr().FromPattern(questionExpression),
419418
),
420419
)
421420
return genericcli.MakeGenericDevice(cli, connector, opts...)

internal/gvendor/gvendor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ type ActionExpectLine struct {
117117
}
118118

119119
func (m ActionExpectLine) Exec(client Client) error {
120-
res, err := client.ReadTo(context.Background(), expr.NewSimpleExpr("(?P<data>.+)(\r\n|\n)"))
120+
res, err := client.ReadTo(context.Background(), expr.NewSimpleExpr().FromPattern("(?P<data>.+)(\r\n|\n)"))
121121
if err != nil {
122122
return err
123123
}

pkg/cmd/cmd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,9 @@ func (m Answer) GetExpr() expr.Expr {
247247
}
248248
var res expr.Expr
249249
if m.question[0] == '/' && m.question[len(m.question)-1] == '/' {
250-
res = expr.NewSimpleExpr(m.question[1 : len(m.question)-1])
250+
res = expr.NewSimpleExpr().FromPattern(m.question[1 : len(m.question)-1])
251251
} else {
252-
res = expr.NewSimpleExpr(regexp.QuoteMeta(m.question))
252+
res = expr.NewSimpleExpr().FromPattern(regexp.QuoteMeta(m.question))
253253
}
254254
return res
255255
}

pkg/devconf/devconf.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,22 @@ func (m DevConf) Make() (*genericcli.GenericCLI, error) {
8383
if err != nil {
8484
return nil, fmt.Errorf("pager expression error %w", err)
8585
}
86-
opts = append(opts, genericcli.WithPager(expr.NewSimpleExprLast200(m.PagerExpression)))
86+
opts = append(opts, genericcli.WithPager(expr.NewSimpleExprLast200().FromPattern(m.PagerExpression)))
8787
}
8888
if len(m.QuestionExpression) > 0 {
8989
_, err := regexp.Compile(m.QuestionExpression)
9090
if err != nil {
9191
return nil, fmt.Errorf("pager question error %w", err)
9292
}
93-
opts = append(opts, genericcli.WithQuestion(expr.NewSimpleExprLast200(m.QuestionExpression)))
93+
opts = append(opts, genericcli.WithQuestion(expr.NewSimpleExprLast200().FromPattern(m.QuestionExpression)))
9494
}
9595
for _, feature := range m.Features {
9696
switch featureTyped := feature.(type) {
9797
case string:
9898
switch featureTyped {
9999
case FeatureSpacesAfterEcho:
100100
a := genericcli.WithEchoExprFn(func(c cmd.Cmd) expr.Expr {
101-
return expr.NewSimpleExpr(fmt.Sprintf(`%s *\r\n`, regexp.QuoteMeta(string(c.Value()))))
101+
return expr.NewSimpleExpr().FromPattern(fmt.Sprintf(`%s *\r\n`, regexp.QuoteMeta(string(c.Value()))))
102102
})
103103
opts = append(opts, a)
104104
default:
@@ -126,8 +126,8 @@ func (m DevConf) Make() (*genericcli.GenericCLI, error) {
126126
}
127127
}
128128
cli := genericcli.MakeGenericCLI(
129-
expr.NewSimpleExprLast200(m.PromptExpression),
130-
expr.NewSimpleExprLast200(errorExpr),
129+
expr.NewSimpleExprLast200().FromPattern(m.PromptExpression),
130+
expr.NewSimpleExprLast200().FromPattern(errorExpr),
131131
opts...,
132132
)
133133
return &cli, nil

pkg/device/cisco/ciscoios.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ var autoCommands = []cmd.Cmd{
3636
}
3737

3838
func NewDevice(connector streamer.Connector, opts ...genericcli.GenericDeviceOption) genericcli.GenericDevice {
39-
cli := genericcli.MakeGenericCLI(expr.NewSimpleExprLast200(promptExpression), expr.NewSimpleExprLast200(errorExpression),
39+
cli := genericcli.MakeGenericCLI(expr.NewSimpleExprLast200().FromPattern(promptExpression), expr.NewSimpleExprLast200().FromPattern(errorExpression),
4040
genericcli.WithLoginExprs(
41-
expr.NewSimpleExprLast200(loginExpression),
42-
expr.NewSimpleExprLast200(passwordExpression),
43-
expr.NewSimpleExprLast200(passwordErrorExpression)),
41+
expr.NewSimpleExprLast200().FromPattern(loginExpression),
42+
expr.NewSimpleExprLast200().FromPattern(passwordExpression),
43+
expr.NewSimpleExprLast200().FromPattern(passwordErrorExpression)),
4444
genericcli.WithPager(
45-
expr.NewSimpleExprLast200(pagerExpression)),
45+
expr.NewSimpleExprLast200().FromPattern(pagerExpression)),
4646
genericcli.WithQuestion(
47-
expr.NewSimpleExprLast200(questionExpression)),
47+
expr.NewSimpleExprLast200().FromPattern(questionExpression)),
4848
genericcli.WithAutoCommands(autoCommands),
4949
genericcli.WithTerminalParams(400, 0),
5050
)

pkg/device/genericcli/genericcli.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ func GenericExecute(command cmd.Cmd, connector streamer.Connector, cli GenericCL
452452
if cli.echoExprFormat != nil {
453453
expCmdEcho = cli.echoExprFormat(command)
454454
} else {
455-
expCmdEcho = expr.NewSimpleExpr(fmt.Sprintf("%s%s", regexp.QuoteMeta(string(command.Value())), AnyNLPattern))
455+
expCmdEcho = expr.NewSimpleExpr().FromPattern(fmt.Sprintf("%s%s", regexp.QuoteMeta(string(command.Value())), AnyNLPattern))
456456
}
457457

458458
var buffer bytes.Buffer
@@ -472,7 +472,7 @@ func GenericExecute(command cmd.Cmd, connector streamer.Connector, cli GenericCL
472472

473473
exprsAdd, exprsAddMap := command.GetExprCallback()
474474
for _, exprCB := range exprsAdd {
475-
exprs.Add("cb", expr.NewSimpleExpr(exprCB))
475+
exprs.Add("cb", expr.NewSimpleExpr().FromPattern(exprCB))
476476
}
477477
cbLimit := 100
478478
seenEcho := false

pkg/device/genericcli/genericcli_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ func newDevice(questionExpression string, connector streamer.Connector, logger *
2323
promptExpression := `(\r\n|^)(?P<prompt>(<\w+>))$`
2424
errorExpression := `(\r\n|^)Error: .+$`
2525
cli := MakeGenericCLI(
26-
expr.NewSimpleExprLast200(promptExpression),
27-
expr.NewSimpleExprLast200(errorExpression),
26+
expr.NewSimpleExprLast200().FromPattern(promptExpression),
27+
expr.NewSimpleExprLast200().FromPattern(errorExpression),
2828
WithQuestion(
29-
expr.NewSimpleExprLast200(questionExpression),
29+
expr.NewSimpleExprLast200().FromPattern(questionExpression),
3030
),
3131
)
3232
return MakeGenericDevice(cli, connector, WithDevLogger(logger))

pkg/device/huawei/huawei.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ var autoCommands = []cmd.Cmd{
3333

3434
func NewDevice(connector streamer.Connector, opts ...genericcli.GenericDeviceOption) genericcli.GenericDevice {
3535
cli := genericcli.MakeGenericCLI(
36-
expr.NewSimpleExprLast200(promptExpression),
37-
expr.NewSimpleExprLast200(errorExpression),
36+
expr.NewSimpleExprLast200().FromPattern(promptExpression),
37+
expr.NewSimpleExprLast200().FromPattern(errorExpression),
3838
genericcli.WithLoginExprs(
39-
expr.NewSimpleExprLast200(loginExpression),
40-
expr.NewSimpleExprLast200(passwordExpression),
41-
expr.NewSimpleExprLast200(passwordErrorExpression),
39+
expr.NewSimpleExprLast200().FromPattern(loginExpression),
40+
expr.NewSimpleExprLast200().FromPattern(passwordExpression),
41+
expr.NewSimpleExprLast200().FromPattern(passwordErrorExpression),
4242
),
4343
genericcli.WithPager(
44-
expr.NewSimpleExprLast200(pagerExpression),
44+
expr.NewSimpleExprLast200().FromPattern(pagerExpression),
4545
),
4646
genericcli.WithAutoCommands(autoCommands),
4747
genericcli.WithQuestion(
48-
expr.NewSimpleExprLast200(questionExpression),
48+
expr.NewSimpleExprLast200().FromPattern(questionExpression),
4949
),
5050
genericcli.WithSFTPEnabled(),
5151
genericcli.WithTerminalParams(400, 0),

pkg/device/huawei/huawei_mock_console_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,19 +149,19 @@ func TestPasswRetry(t *testing.T) {
149149

150150
func newConsoleDevice(connector streamer.Connector, opts ...genericcli.GenericDeviceOption) genericcli.GenericDevice {
151151
cli := genericcli.MakeGenericCLI(
152-
expr.NewSimpleExprLast200(promptExpression),
153-
expr.NewSimpleExprLast200(errorExpression),
152+
expr.NewSimpleExprLast200().FromPattern(promptExpression),
153+
expr.NewSimpleExprLast200().FromPattern(errorExpression),
154154
genericcli.WithLoginExprs(
155-
expr.NewSimpleExprLast200(loginExpression),
156-
expr.NewSimpleExprLast200(passwordExpression),
157-
expr.NewSimpleExprLast200(passwordErrorExpression),
155+
expr.NewSimpleExprLast200().FromPattern(loginExpression),
156+
expr.NewSimpleExprLast200().FromPattern(passwordExpression),
157+
expr.NewSimpleExprLast200().FromPattern(passwordErrorExpression),
158158
),
159159
genericcli.WithPager(
160-
expr.NewSimpleExprLast200(pagerExpression),
160+
expr.NewSimpleExprLast200().FromPattern(pagerExpression),
161161
),
162162
genericcli.WithAutoCommands(autoCommands),
163163
genericcli.WithQuestion(
164-
expr.NewSimpleExprLast200(questionExpression),
164+
expr.NewSimpleExprLast200().FromPattern(questionExpression),
165165
),
166166
genericcli.WithSFTPEnabled(),
167167
genericcli.WithTerminalParams(400, 0),

pkg/device/juniper/device.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ var autoCommands = []cmd.Cmd{
2828

2929
func NewDevice(connector streamer.Connector, opts ...genericcli.GenericDeviceOption) genericcli.GenericDevice {
3030
cli := genericcli.MakeGenericCLI(
31-
expr.NewSimpleExprLast200(promptExpression),
32-
expr.NewSimpleExprLast200(errorExpression),
31+
expr.NewSimpleExprLast200().FromPattern(promptExpression),
32+
expr.NewSimpleExprLast200().FromPattern(errorExpression),
3333
genericcli.WithPager(
34-
expr.NewSimpleExprLast200(pagerExpression),
34+
expr.NewSimpleExprLast200().FromPattern(pagerExpression),
3535
),
3636
genericcli.WithAutoCommands(autoCommands),
3737
genericcli.WithSFTPEnabled(),
3838
genericcli.WithEchoExprFn(func(c cmd.Cmd) expr.Expr {
39-
return expr.NewSimpleExpr(fmt.Sprintf(`%s *\r\n`, regexp.QuoteMeta(string(c.Value()))))
39+
return expr.NewSimpleExpr().FromPattern(fmt.Sprintf(`%s *\r\n`, regexp.QuoteMeta(string(c.Value()))))
4040
}),
4141
genericcli.WithTerminalParams(400, 0),
4242
)

pkg/device/netconf/device.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (m *NetconfDevice) Connect(ctx context.Context) (err error) {
141141
if err != nil {
142142
return err
143143
}
144-
res, err := m.connector.ReadTo(ctx, expr.NewSimpleExprLast20(eom))
144+
res, err := m.connector.ReadTo(ctx, expr.NewSimpleExprLast20().FromPattern(eom))
145145
if err != nil {
146146
return err
147147
}
@@ -257,7 +257,7 @@ func (m *NetconfDevice) cmd10(ctx context.Context, command []byte) ([]byte, erro
257257
return nil, err
258258
}
259259

260-
res, err := m.connector.ReadTo(ctx, expr.NewSimpleExprLast20(eom))
260+
res, err := m.connector.ReadTo(ctx, expr.NewSimpleExprLast20().FromPattern(eom))
261261
if err != nil {
262262
return nil, err
263263
}
@@ -295,7 +295,7 @@ func (m *NetconfDevice) readChunked(ctx context.Context) ([]byte, error) {
295295
// HASH = %x23
296296
// LF = %x0A
297297
// OCTET = %x00-FF
298-
sizeLine, err := m.connector.ReadTo(ctx, expr.NewSimpleExprFirst200(`\n#(?P<size>[1-9]\d*|#)\n`))
298+
sizeLine, err := m.connector.ReadTo(ctx, expr.NewSimpleExprFirst200().FromPattern(`\n#(?P<size>[1-9]\d*|#)\n`))
299299
if err != nil {
300300
return nil, fmt.Errorf("chunk size read error %w", err)
301301
}

pkg/device/nxos/device.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ var autoCommands = []cmd.Cmd{
2727
}
2828

2929
func NewDevice(connector streamer.Connector, opts ...genericcli.GenericDeviceOption) genericcli.GenericDevice {
30-
cli := genericcli.MakeGenericCLI(expr.NewSimpleExprLast200(promptExpression), expr.NewSimpleExprLast200(errorExpression),
30+
cli := genericcli.MakeGenericCLI(
31+
expr.NewSimpleExprLast200().FromPattern(promptExpression),
32+
expr.NewSimpleExprLast200().FromPattern(errorExpression),
3133
genericcli.WithPager(
32-
expr.NewSimpleExprLast200(pagerExpression)),
34+
expr.NewSimpleExprLast200().FromPattern(pagerExpression)),
3335
genericcli.WithEchoExprFn(func(c cmd.Cmd) expr.Expr {
34-
return expr.NewSimpleExpr(fmt.Sprintf(`%s\r\r\n`, regexp.QuoteMeta(string(c.Value()))))
36+
return expr.NewSimpleExpr().FromPattern(fmt.Sprintf(`%s\r\r\n`, regexp.QuoteMeta(string(c.Value()))))
3537
}),
3638
genericcli.WithAutoCommands(autoCommands),
3739
genericcli.WithTerminalParams(400, 0),

pkg/device/ros/device.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ const (
2525

2626
func NewDevice(connector streamer.Connector, opts ...genericcli.GenericDeviceOption) genericcli.GenericDevice {
2727
cli := genericcli.MakeGenericCLI(
28-
expr.NewSimpleExprLast(promptExpression, 1500),
29-
expr.NewSimpleExprLast200(errorExpression),
28+
expr.NewSimpleExprLast(1500).FromPattern(promptExpression),
29+
expr.NewSimpleExprLast200().FromPattern(errorExpression),
3030
genericcli.WithQuestion(
31-
expr.NewSimpleExprLast200(questionExpression),
31+
expr.NewSimpleExprLast200().FromPattern(questionExpression),
3232
),
33-
genericcli.WithPager(expr.NewSimpleExprLast200(pagerExpression)),
33+
genericcli.WithPager(expr.NewSimpleExprLast200().FromPattern(pagerExpression)),
3434
genericcli.WithCredentialInterceptor(credentialLoginModifier),
3535
genericcli.WithWriteNewLine([]byte("\r\n")),
3636
)

0 commit comments

Comments
 (0)