// Copyright 2017 Google LLC. All Rights Reserved. // // 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 surface_v1 import ( "log" nethttp "net/http" "net/url" "path" "strconv" "strings" ) // The structure to transport information during the recursive calls inside model_openapiv2.go // and model_openapiv3.go type FieldInfo struct { fieldKind FieldKind fieldType string fieldFormat string // For parameters fieldPosition Position fieldName string enumValues []string } func (m *Model) addType(t *Type) { m.Types = append(m.Types, t) } func (m *Model) addMethod(method *Method) { m.Methods = append(m.Methods, method) } func (m *Model) TypeWithTypeName(name string) *Type { if name == "" { return nil } for _, t := range m.Types { if t.TypeName == name { return t } } return nil } func generateOperationName(method, path string) string { filteredPath := strings.Replace(path, "/", "_", -1) filteredPath = strings.Replace(filteredPath, ".", "_", -1) filteredPath = strings.Replace(filteredPath, "{", "", -1) filteredPath = strings.Replace(filteredPath, "}", "", -1) return strings.Title(method) + filteredPath } func sanitizeOperationName(name string) string { name = strings.Title(name) name = strings.Replace(name, ".", "_", -1) return name } func typeForRef(ref string) (typeName string) { return path.Base(ref) } // Helper method to build a surface model Type func makeType(name string) *Type { t := &Type{ Name: name, Kind: TypeKind_STRUCT, Fields: make([]*Field, 0), } return t } // Helper method to build a surface model Field func makeFieldAndAppendToType(info *FieldInfo, schemaType *Type, fieldName string) { if info != nil { f := &Field{Name: info.fieldName} if fieldName != "" { f.Name = fieldName } f.Type, f.Kind, f.Format, f.Position, f.EnumValues = info.fieldType, info.fieldKind, info.fieldFormat, info.fieldPosition, info.enumValues schemaType.Fields = append(schemaType.Fields, f) } } // Helper method to determine the type of the value property for a map. func determineMapValueType(fInfo FieldInfo) (mapValueType string) { if fInfo.fieldKind == FieldKind_ARRAY { mapValueType = "[]" } if fInfo.fieldFormat != "" { fInfo.fieldType = fInfo.fieldFormat } mapValueType += fInfo.fieldType return mapValueType } // Converts a string status code like: "504" into the corresponding text ("Gateway_Timeout") func convertStatusCodeToText(c string) (statusText string) { code, err := strconv.Atoi(c) if err == nil { statusText = nethttp.StatusText(code) if statusText == "" { log.Println("Status code " + c + " is not known to net.http.StatusText. This might cause unpredictable behavior.") statusText = "unknownStatusCode" } statusText = strings.Replace(statusText, " ", "_", -1) } return statusText } // Searches all created types so far and returns the Type where 'typeName' matches. func findType(types []*Type, typeName string) *Type { for _, t := range types { if typeName == t.Name { return t } } return nil } // Returns true if s is a valid URL. func isSymbolicReference(s string) bool { _, err := url.ParseRequestURI(s) if err != nil { return false } return true } // Replace encoded URLS with actual characters func validTypeForRef(XRef string) string { t, _ := url.QueryUnescape(typeForRef(XRef)) return t }