// Copyright 2015 go-swagger maintainers // // 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. package swag import ( "encoding/json" "fmt" "path/filepath" "strconv" yaml "gopkg.in/yaml.v2" ) // YAMLMatcher matches yaml func YAMLMatcher(path string) bool { ext := filepath.Ext(path) return ext == ".yaml" || ext == ".yml" } // YAMLToJSON converts YAML unmarshaled data into json compatible data func YAMLToJSON(data interface{}) (json.RawMessage, error) { jm, err := transformData(data) if err != nil { return nil, err } b, err := WriteJSON(jm) return json.RawMessage(b), err } func BytesToYAMLDoc(data []byte) (interface{}, error) { var document map[interface{}]interface{} if err := yaml.Unmarshal(data, &document); err != nil { return nil, err } return document, nil } func transformData(in interface{}) (out interface{}, err error) { switch in.(type) { case map[interface{}]interface{}: o := make(map[string]interface{}) for k, v := range in.(map[interface{}]interface{}) { sk := "" switch k.(type) { case string: sk = k.(string) case int: sk = strconv.Itoa(k.(int)) default: return nil, fmt.Errorf("types don't match: expect map key string or int get: %T", k) } v, err = transformData(v) if err != nil { return nil, err } o[sk] = v } return o, nil case []interface{}: in1 := in.([]interface{}) len1 := len(in1) o := make([]interface{}, len1) for i := 0; i < len1; i++ { o[i], err = transformData(in1[i]) if err != nil { return nil, err } } return o, nil } return in, nil } // YAMLDoc loads a yaml document from either http or a file and converts it to json func YAMLDoc(path string) (json.RawMessage, error) { yamlDoc, err := YAMLData(path) if err != nil { return nil, err } data, err := YAMLToJSON(yamlDoc) if err != nil { return nil, err } return json.RawMessage(data), nil } // YAMLData loads a yaml document from either http or a file func YAMLData(path string) (interface{}, error) { data, err := LoadFromFileOrHTTP(path) if err != nil { return nil, err } return BytesToYAMLDoc(data) }