aboutsummaryrefslogtreecommitdiff
path: root/cpe/avstring.go
diff options
context:
space:
mode:
Diffstat (limited to 'cpe/avstring.go')
-rw-r--r--cpe/avstring.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/cpe/avstring.go b/cpe/avstring.go
new file mode 100644
index 0000000..46e16cf
--- /dev/null
+++ b/cpe/avstring.go
@@ -0,0 +1,54 @@
+package cpe
+
+//go:generate stringer -linecomment -type=AvStringType
+
+import (
+ "fmt"
+)
+
+// type of avstring.
+type AvStringType byte
+
+const (
+ AnyString AvStringType = iota // any
+ NaString // na
+ ValString // val
+)
+
+// String value (NISTIR 7695, CPE 2.3 spec, Figure 6-3)
+type AvString struct {
+ Type AvStringType // value type
+ Val string // value
+}
+
+// token type to avstring type map
+var avTypes = map[tokenType]AvStringType {
+ anyToken: AnyString,
+ naToken: NaString,
+ valToken: ValString,
+}
+
+// create new AvString from token.
+func newAvString(t token) (AvString, error) {
+ if at, ok := avTypes[t.Type]; ok {
+ return AvString { at, t.Val }, nil
+ } else {
+ err := fmt.Errorf("invalid token type: 0x%02x", byte(t.Type))
+ return AvString { 0, "" }, err
+ }
+}
+
+// Serialize as string.
+func (s AvString) String() string {
+ switch s.Type {
+ case AnyString:
+ return "*"
+ case NaString:
+ return "-"
+ case ValString:
+ return s.Val
+ default:
+ // not sure what to return here
+ return ""
+ }
+}