forked from sleepinggenius2/gosmi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommon.go
140 lines (120 loc) · 3.22 KB
/
common.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package parser
import (
"fmt"
"strconv"
"github.com/alecthomas/participle/lexer"
"github.com/sleepinggenius2/gosmi/types"
)
type SubIdentifier struct {
Pos lexer.Position
Name *types.SmiIdentifier
Number *types.SmiSubId
}
func (x *SubIdentifier) Parse(lex *lexer.PeekingLexer) error {
token, err := lex.Next()
if err != nil {
return err
}
x.Pos = token.Pos
symbols := smiLexer.Symbols()
if token.Type == symbols["Int"] {
n, err := strconv.ParseUint(token.Value, 10, 32)
if err != nil {
return fmt.Errorf("Parse number: %w", err)
}
x.Number = new(types.SmiSubId)
*x.Number = types.SmiSubId(n)
return nil
} else if token.Type != symbols["Ident"] {
return fmt.Errorf("Unexpected %q, expected Ident", token)
}
x.Name = new(types.SmiIdentifier)
*x.Name = types.SmiIdentifier(token.Value)
token, err = lex.Peek(0)
if err != nil {
return err
}
if token.Value != "(" {
return nil
}
_, err = lex.Next()
if err != nil {
return err
}
token, err = lex.Next()
if err != nil {
return err
}
if token.Type != symbols["Int"] {
return fmt.Errorf("Unexpected %q, expected Int", token)
}
n, err := strconv.ParseUint(token.Value, 10, 32)
if err != nil {
return fmt.Errorf("Parse number: %w", err)
}
x.Number = new(types.SmiSubId)
*x.Number = types.SmiSubId(n)
token, err = lex.Next()
if err != nil {
return err
}
if token.Value != ")" {
return fmt.Errorf("Unexpected %q, expected \")\"", token)
}
return nil
}
type Oid struct {
Pos lexer.Position
SubIdentifiers []SubIdentifier `parser:"@@+"`
}
// Per RFC2578 Appendix A, not all valid ASN.1 refinements are allowed by SMI
// Specifically, MIN and MAX are not valid range values, nor is '<' permitted on the lower or upper end point
type Range struct {
Pos lexer.Position
Start string `parser:"@( \"-\"? Int | BinString | HexString )"`
End string `parser:"( \"..\" @( \"-\"? Int | BinString | HexString ) )?"`
}
type Status string
const (
StatusMandatory Status = "mandatory"
StatusOptional Status = "optional"
StatusCurrent Status = "current"
StatusDeprecated Status = "deprecated"
StatusObsolete Status = "obsolete"
)
func (s Status) ToSmi() types.Status {
switch s {
case StatusMandatory:
return types.StatusMandatory
case StatusOptional:
return types.StatusOptional
case StatusCurrent:
return types.StatusCurrent
case StatusDeprecated:
return types.StatusDeprecated
case StatusObsolete:
return types.StatusObsolete
}
return types.StatusUnknown
}
type SubType struct {
Pos lexer.Position
OctetString []Range `parser:"( ( \"SIZE\" \"(\" ( @@ ( \"|\" @@ )* ) \")\" )"`
Integer []Range `parser:"| @@ ( \"|\" @@ )* )"`
}
type NamedNumber struct {
Pos lexer.Position
Name types.SmiIdentifier `parser:"@Ident"`
Value string `parser:"\"(\" @( \"-\"? Int ) \")\""`
}
type SyntaxType struct {
Pos lexer.Position
Name types.SmiIdentifier `parser:"@( OctetString | ObjectIdentifier | Ident )"`
SubType *SubType `parser:"( ( \"(\" @@ \")\" )"`
Enum []NamedNumber `parser:"| ( \"{\" @@ ( \",\" @@ )* \",\"? \"}\" ) )?"`
}
type Syntax struct {
Pos lexer.Position
Sequence *types.SmiIdentifier `parser:"( \"SEQUENCE\" \"OF\" @Ident )"`
Type *SyntaxType `parser:"| @@"`
}