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