aboutsummaryrefslogtreecommitdiff
path: root/cpe/avstring.go
blob: 46e16cf2402d7dfe4aa34794401861434d9fdc0a (plain)
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
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 ""
  }
}