serverObjectDefinitions deconflicts server names and returns the stable, deterministically-named ServerObjectDefinitions for `spec`. Used by both BuildServerURLTypeDefinitions and GenerateServerURLs so they generate identifiers that match.
(spec *openapi3.T)
| 102 | // Used by both BuildServerURLTypeDefinitions and GenerateServerURLs so |
| 103 | // they generate identifiers that match. |
| 104 | func serverObjectDefinitions(spec *openapi3.T) ([]ServerObjectDefinition, error) { |
| 105 | names := make(map[string]*openapi3.Server) |
| 106 | |
| 107 | for _, server := range spec.Servers { |
| 108 | var name string |
| 109 | if goNameExt, ok := server.Extensions[extGoName]; ok { |
| 110 | customName, err := extParseGoFieldName(goNameExt) |
| 111 | if err != nil { |
| 112 | return nil, fmt.Errorf("invalid value for %q: %w", extGoName, err) |
| 113 | } |
| 114 | if customName != "" { |
| 115 | name = customName |
| 116 | } |
| 117 | } |
| 118 | if name == "" { |
| 119 | suffix := server.Description |
| 120 | if suffix == "" { |
| 121 | suffix = nameNormalizer(server.URL) |
| 122 | } |
| 123 | name = serverURLPrefix + UppercaseFirstCharacter(suffix) |
| 124 | name = nameNormalizer(name) |
| 125 | } |
| 126 | |
| 127 | // if this is the only type with this name, store it |
| 128 | if _, conflict := names[name]; !conflict { |
| 129 | names[name] = server |
| 130 | continue |
| 131 | } |
| 132 | |
| 133 | // otherwise, try appending a number to the name. Start at 1 so |
| 134 | // `Foo` / `Foo1` reads better than `Foo` / `Foo0`. |
| 135 | saved := false |
| 136 | for i := 1; i < 1+serverURLSuffixIterations; i++ { |
| 137 | suffixed := name + strconv.Itoa(i) |
| 138 | if _, suffixConflict := names[suffixed]; !suffixConflict { |
| 139 | names[suffixed] = server |
| 140 | saved = true |
| 141 | break |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | if saved { |
| 146 | continue |
| 147 | } |
| 148 | |
| 149 | return nil, fmt.Errorf("failed to create a unique name for the Server URL (%#v) with description (%#v) after %d iterations", server.URL, server.Description, serverURLSuffixIterations) |
| 150 | } |
| 151 | |
| 152 | keys := SortedMapKeys(names) |
| 153 | servers := make([]ServerObjectDefinition, len(keys)) |
| 154 | for i, k := range keys { |
| 155 | servers[i] = ServerObjectDefinition{ |
| 156 | GoName: k, |
| 157 | OAPISchema: names[k], |
| 158 | } |
| 159 | } |
| 160 | return servers, nil |
| 161 | } |
no test coverage detected