forked from vapourismo/ets-go
-
Notifications
You must be signed in to change notification settings - Fork 1
/
hardware.go
81 lines (66 loc) · 1.87 KB
/
hardware.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
package ets
import (
"encoding/xml"
"fmt"
"io"
)
// TranslationRefID is the ID of a translation.
type TranslationRefID string
type Translation struct {
RefID TranslationRefID
Texts map[string]string
}
// LanguageID is the ID of a language.
type LanguageID string
type Language struct {
ID LanguageID
Translations []Translation
}
// ProductID is the ID of a product.
type ProductID string
type Product struct {
ID ProductID
ManufacturerID ManufacturerID
HardwareID HardwareID
Text string
}
type Hardware2ProgramID string
type Hardware2Program struct {
ManufacturerID ManufacturerID
HardwareID HardwareID
ID Hardware2ProgramID
ApplicationProgramIDs []ApplicationProgramID
}
// HardwareID is the ID of a manufacturer.
type HardwareID string
type Hardware struct {
ID HardwareID
Name string
Products []Product
Hardware2Programs []Hardware2Program
}
// HardwareData contains hardware-specific data.
type HardwareData struct {
Manufacturer ManufacturerID
Hardwares []Hardware
Languages []Language
}
// UnmarshalXML implements xml.Unmarshaler.
func (md *HardwareData) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
// Decide which schema to use based on the value of the 'xmlns' attribute.
ns := getNamespace(start)
switch ns {
case schema11Namespace, schema12Namespace, schema13Namespace, schema14Namespace, schema20Namespace, schema21Namespace, schema22Namespace, schema23Namespace:
return d.DecodeElement((*hardwareData11)(md), &start)
default:
return fmt.Errorf("Unexpected namespace '%s'", ns)
}
}
// DecodeHardwareData parses the contents of a manufacturer file.
func DecodeHardwareData(r io.Reader) (*HardwareData, error) {
md := &HardwareData{}
if err := xml.NewDecoder(r).Decode(md); err != nil {
return nil, err
}
return md, nil
}