1package main
2
3import (
4	"encoding/json"
5	"flag"
6	"io/ioutil"
7	"log"
8	"strings"
9)
10
11const RefKey = "$ref"
12
13func main() {
14	var input, output string
15	flag.StringVar(&input, "if", "", "input file")
16	flag.StringVar(&output, "of", "", "output file")
17
18	flag.Parse()
19
20	if input == "" || output == "" {
21		log.Fatal("no file specified, input", input, ", output", output)
22	}
23
24	//nolint
25	b, err := ioutil.ReadFile(input)
26	if err != nil {
27		log.Fatal(err)
28	}
29
30	data := make(map[string]interface{})
31	if err := json.Unmarshal(b, &data); err != nil {
32		log.Fatal(err)
33	}
34
35	info, ok := data["info"].(map[string]interface{})
36	if info == nil {
37		log.Fatal("expecting 'info' field")
38	}
39	if !ok {
40		log.Fatal("unable to turn info field into map[string]interface{}")
41	}
42
43	if info["title"] == nil {
44		info["title"] = "Unified Alerting API"
45	}
46
47	definitions, ok := data["definitions"]
48	if !ok {
49		log.Fatal("no definitions")
50	}
51
52	defs := definitions.(map[string]interface{})
53	for k, v := range defs {
54		vMap := v.(map[string]interface{})
55		refKey, ok := vMap[RefKey]
56		if !ok {
57			continue
58		}
59
60		if strings.TrimPrefix(refKey.(string), "#/definitions/") == k {
61			log.Println("removing circular ref key", refKey)
62			delete(vMap, RefKey)
63		}
64	}
65
66	out, err := json.MarshalIndent(data, "", " ")
67	if err != nil {
68		log.Fatal(err)
69	}
70
71	err = ioutil.WriteFile(output, out, 0644)
72	if err != nil {
73		log.Fatal(err)
74	}
75}
76