I am writing some code that parses a YAML file and validates the data inside. Each parser returns an error if the value found does not meet the requirements. Right now I am creating an array of errors and setting the return of each call to a different index in the array. My current implementation is working, but it seems wrong and I want to see if there is a better way to accomplish this.
Here is an example
func createStruct(yamlMap map[interface{}]interface{}) (myStruct, error) {
errs := make([]error, 6)
s := myStruct{}
s.Name, errs[0] = getString(yamlMap, "name", true)
s.Tag, errs[1] = getIntValidRange(yamlMap, "tag", 1, 4094, true)
s.TaggedPorts, errs[2] = getStringPortList(yamlMap, "tagged_ports", true)
s.UntaggedPorts, errs[3] = getStringPortList(yamlMap, "untagged_ports", true)
s.IP, errs[4] = getIPString(yamlMap, "ip", true)
s.Netmask, errs[5] = getIPString(yamlMap, "netmask", true)
return s, structCreateErrorChecker(errs)
}
The reason I don't handle each error after each function, is because I want to try to parse everything first and then collect all errors and log them. That is what structCreateErrorChecker() does.
Here is the YAML I am trying to parse (it's come up in the comments). When I say dynamic I mean that there can be any number of these controlling_bridge sections and each vlan section can have any number of vlans.
controlling_bridge_1:
ip: "1.1.1.1"
ports: ["1","2"]
vlans:
vlan01:
name: "vlan1"
tag: 1001
ports: ["1"]
ip: "2.2.2.2"
vlan02:
name: "vlan02"
tag: 1002
ports: ["3", "4"]
ip: "3.3.3.1"
controlling_bridge_2:
ip: "1.1.1.1"
ports: ["1","2"]
vlans:
vlan01:
name: "vlan1"
tag: 1001
ports: ["1"]
ip: "2.2.2.2"
vlan02:
name: "vlan02"
tag: 1002
ports: ["3", "4"]
ip: "3.3.3.1"