diff --git a/jdr/type.go b/jdr/type.go index 93aaf6f..c61939b 100644 --- a/jdr/type.go +++ b/jdr/type.go @@ -12,7 +12,8 @@ var regexp_d = regexp.MustCompile(`^[1-9][0-9]*d([468]|1[02]|20|100)$`) type VariableType interface { Name() string - Validate(s string) bool + Validate(value string) bool + DefaultValue() string } type VariableType_badType struct {} @@ -25,6 +26,10 @@ func (*VariableType_badType) Validate(s string) bool { return false } +func (*VariableType_badType) DefaultValue() string { + return "" +} + type VariableType_bool struct {} func (*VariableType_bool) Name() string { @@ -47,6 +52,10 @@ func (self *VariableType_bool) Validate(value string) bool { return err == nil } +func (self *VariableType_bool) DefaultValue() string { + return "false" +} + type VariableType_int struct {} func (*VariableType_int) Name() string { @@ -62,6 +71,10 @@ func (self *VariableType_int) Validate(value string) bool { return err == nil } +func (self *VariableType_int) DefaultValue() string { + return "0" +} + type VariableType_float struct {} func (*VariableType_float) Name() string { @@ -77,6 +90,10 @@ func (self *VariableType_float) Validate(value string) bool { return err == nil } +func (self *VariableType_float) DefaultValue() string { + return "0.0" +} + type VariableType_string struct {} func (*VariableType_string) Name() string { @@ -87,6 +104,10 @@ func (*VariableType_string) Validate(s string) bool { return true } +func (self *VariableType_string) DefaultValue() string { + return "" +} + type VariableType_d struct {} func (*VariableType_d) Name() string { @@ -97,6 +118,11 @@ func (*VariableType_d) Validate(s string) bool { return regexp_d.MatchString(s) } +func (self *VariableType_d) DefaultValue() string { + //FIXME: non-generic version + return "" +} + func makeVariableType(s string) VariableType { switch(strings.ToLower(s)) { case "bool": @@ -125,18 +151,27 @@ func (self *CustomEnum) Name() string { return self.name } -func (self *CustomEnum) Validate(s string) bool { - if !self.BaseType.Validate(s) { - return false +func (self *CustomEnum) ToId(value string) (int, error) { + if !self.BaseType.Validate(value) { + return 0, errors.New("Invalid value") } for i := 0; i < len(self.Values); i++ { - if self.Values[i] == s { - return true + if self.Values[i] == value { + return i, nil } } - return false + return 0, errors.New("No such element") +} + +func (self *CustomEnum) Validate(value string) bool { + _, err := self.ToId(value) + return err == nil +} + +func (self *CustomEnum) DefaultValue() string { + return "" } type CustomStruct struct { @@ -154,6 +189,11 @@ func (self *CustomStruct) Validate(s string) bool { return false } +func (self *CustomStruct) DefaultValue() string { + //FIXME: non-generic version + return "" +} + func parseCustomEnum(root xmlNode) (*CustomEnum, error) { customEnum := CustomEnum {}