| 42 | } |
| 43 | |
| 44 | func ParseVersionString(input string) *ParsedInfo { |
| 45 | var output ParsedInfo |
| 46 | |
| 47 | // Quick fix to filter out enodes. |
| 48 | if strings.Contains(input, "enode://") { |
| 49 | return nil |
| 50 | } |
| 51 | |
| 52 | // If there exists more than one version, don't count it |
| 53 | if strings.Count(input, "/v") > 1 { |
| 54 | return nil |
| 55 | } |
| 56 | |
| 57 | // version string consists of four components, divided by / |
| 58 | s := strings.Split(strings.ToLower(input), "/") |
| 59 | l := len(s) |
| 60 | output.Name = strings.ToLower(s[0]) |
| 61 | if output.Name == "" { |
| 62 | return nil |
| 63 | } |
| 64 | |
| 65 | if l == 5 || l == 7 { |
| 66 | output.Label = s[1] |
| 67 | output.Version = parseVersion(s[2]) |
| 68 | output.Os = parseOS(s[3]) |
| 69 | output.Language = parseLanguage(s[4]) |
| 70 | } else if l == 4 { |
| 71 | output.Version = parseVersion(s[1]) |
| 72 | output.Os = parseOS(s[2]) |
| 73 | output.Language = parseLanguage(s[3]) |
| 74 | } else if (l == 1 || l == 0) && (output.Name == "tmp" || output.Name == "eth2") { |
| 75 | // These are usually "tmp" nodes that cannot be parsed. |
| 76 | } else { |
| 77 | fmt.Printf("Parser Error: Invalid length of '%d' for input: '%s'\n", l, input) |
| 78 | } |
| 79 | |
| 80 | if output.Version.Error { |
| 81 | fmt.Printf(" -> Error Parsing: '%s', %v\n", input, output) |
| 82 | return nil |
| 83 | } |
| 84 | return &output |
| 85 | } |
| 86 | |
| 87 | func parseLanguage(input string) LanguageInfo { |
| 88 | var languageInfo LanguageInfo |