| 264 | } |
| 265 | |
| 266 | func hover(schema *jsonschema.Schema, nodes []ast.Node, line, column, lineLength int) *protocol.Hover { |
| 267 | for _, match := range nodes { |
| 268 | if schema.Ref != nil { |
| 269 | schema = schema.Ref |
| 270 | } |
| 271 | |
| 272 | if nested, ok := schema.Items.(*jsonschema.Schema); ok { |
| 273 | if nested.Ref != nil { |
| 274 | nested = nested.Ref |
| 275 | } |
| 276 | for _, n := range nested.OneOf { |
| 277 | if n.Types != nil && slices.Contains(n.Types.ToStrings(), "object") { |
| 278 | if len(n.Properties) > 0 { |
| 279 | if _, ok := n.Properties[match.GetToken().Value]; ok { |
| 280 | schema = n |
| 281 | break |
| 282 | } |
| 283 | } |
| 284 | } |
| 285 | } |
| 286 | |
| 287 | if _, ok := nested.Properties[match.GetToken().Value]; ok { |
| 288 | schema = nested |
| 289 | } |
| 290 | } |
| 291 | |
| 292 | for _, nested := range schema.OneOf { |
| 293 | if nested.Types != nil && slices.Contains(nested.Types.ToStrings(), "object") { |
| 294 | schema = nested |
| 295 | break |
| 296 | } |
| 297 | } |
| 298 | |
| 299 | if property, ok := schema.Properties[match.GetToken().Value]; ok { |
| 300 | if property.Ref != nil { |
| 301 | property = property.Ref |
| 302 | } |
| 303 | if property.Enum != nil { |
| 304 | if match.GetToken().Position.Column <= column && column <= lineLength { |
| 305 | var builder strings.Builder |
| 306 | if property.Description != "" { |
| 307 | builder.WriteString(property.Description) |
| 308 | builder.WriteString("\n\n") |
| 309 | } |
| 310 | builder.WriteString("Allowed values:\n") |
| 311 | enumValues := []string{} |
| 312 | for _, value := range property.Enum.Values { |
| 313 | enumValues = append(enumValues, fmt.Sprintf("%v", value)) |
| 314 | } |
| 315 | slices.Sort(enumValues) |
| 316 | for _, value := range enumValues { |
| 317 | builder.WriteString(fmt.Sprintf("- `%v`\n", value)) |
| 318 | } |
| 319 | builder.WriteString("\nSchema: [compose-spec.json](https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json)") |
| 320 | builder.WriteString(fmt.Sprintf( |
| 321 | "\n\n[Online documentation](https://docs.docker.com/reference/compose-file/%v/#%v)", |
| 322 | nodes[0].GetToken().Value, |
| 323 | nodes[2].GetToken().Value, |