// - // ========================LICENSE_START================================= // O-RAN-SC // %% // Copyright (C) 2022: Nordix Foundation // %% // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ========================LICENSE_END=================================== // package main import ( "flag" "fmt" "io/ioutil" "log" "os" "path/filepath" "reflect" "strconv" "strings" "gopkg.in/yaml.v2" ) type Enum struct { Enum []string `yaml:"enum"` Type string `yaml:"type"` Description string `yaml:"description"` } func main() { var apiDir = flag.String("apidir", "", "Directory containing API definitions to fix") flag.Parse() err := filepath.Walk(*apiDir, fixEnums) if err != nil { fmt.Println(err) } } func fixEnums(path string, info os.FileInfo, _ error) error { if !info.IsDir() && strings.HasSuffix(info.Name(), ".yaml") { yamlFile, err := ioutil.ReadFile(path) if err != nil { log.Printf("yamlFile. Get err #%v ", err) } m := make(map[string]interface{}) err = yaml.Unmarshal(yamlFile, m) if err != nil { log.Fatalf("Unmarshal: %v", err) } components := m["components"] if components != nil { cMap := components.(map[interface{}]interface{}) if _, ok := cMap["schemas"].(map[interface{}]interface{}); ok { schemas := cMap["schemas"].(map[interface{}]interface{}) for typeName, typeDef := range schemas { tDMap := typeDef.(map[interface{}]interface{}) anyOf, ok := tDMap["anyOf"] if ok { aOSlice := anyOf.([]interface{}) correctEnum := Enum{} mapInterface := aOSlice[0].(map[interface{}]interface{}) enumInterface := mapInterface["enum"] if enumInterface != nil { is := enumInterface.([]interface{}) var enumVals []string for i := 0; i < len(is); i++ { if reflect.TypeOf(is[i]).Kind() == reflect.String { enumVals = append(enumVals, is[i].(string)) } else if reflect.TypeOf(is[1]).Kind() == reflect.Int { enumVals = append(enumVals, strconv.Itoa(is[i].(int))) } } correctEnum.Enum = enumVals correctEnum.Type = "string" description := tDMap["description"] if description != nil { correctEnum.Description = description.(string) } else { if aOSlice[1] != nil { mapInterface = aOSlice[1].(map[interface{}]interface{}) description := mapInterface["description"] if description != nil { correctEnum.Description = description.(string) } } } schemas[typeName] = correctEnum } } } modM, err := yaml.Marshal(m) if err != nil { log.Printf("yamlFile. Get err #%v ", err) } err = ioutil.WriteFile(path, modM, 0644) if err != nil { log.Printf("yamlFile. Get err #%v ", err) } } } } return nil }