in commands/api.go [942:1010]
func parseSwaggerApi(configfile string, namespace string) (*whisk.Api, error) {
// Test is for completeness, but this situation should only arise due to an internal error
if len(configfile) == 0 {
whisk.Debug(whisk.DbgError, "No swagger file is specified\n")
errMsg := wski18n.T("A configuration file was not specified.")
whiskErr := whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
return nil, whiskErr
}
swagger, err := ReadFile(configfile)
if err != nil {
whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", configfile, err)
errMsg := wski18n.T("Error reading swagger file '{{.name}}': {{.err}}",
map[string]interface{}{"name": configfile, "err": err})
whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXIT_CODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
return nil, whiskErr
}
// Check if this swagger is in JSON or YAML format
isYaml := strings.HasSuffix(configfile, yamlFileExtension) || strings.HasSuffix(configfile, ymlFileExtension)
if isYaml {
whisk.Debug(whisk.DbgInfo, "Converting YAML formated API configuration into JSON\n")
jsonbytes, err := yaml.YAMLToJSON([]byte(swagger))
if err != nil {
whisk.Debug(whisk.DbgError, "yaml.YAMLToJSON() error: %s\n", err)
errMsg := wski18n.T("Unable to parse YAML configuration file: {{.err}}", map[string]interface{}{"err": err})
whiskErr := whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
return nil, whiskErr
}
swagger = string(jsonbytes)
}
// Parse the JSON into a swagger object
swaggerObj := new(whisk.ApiSwagger)
err = json.Unmarshal([]byte(swagger), swaggerObj)
if err != nil {
whisk.Debug(whisk.DbgError, "JSON parse of '%s' error: %s\n", configfile, err)
errMsg := wski18n.T("Error parsing swagger file '{{.name}}': {{.err}}",
map[string]interface{}{"name": configfile, "err": err})
whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXIT_CODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
return nil, whiskErr
}
if swaggerObj.BasePath == "" || swaggerObj.SwaggerName == "" || swaggerObj.Info == nil || swaggerObj.Paths == nil {
whisk.Debug(whisk.DbgError, "Swagger file is invalid.\n")
errMsg := wski18n.T("Swagger file is invalid (missing basePath, info, paths, or swagger fields)")
whiskErr := whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
return nil, whiskErr
}
if _, ok := isValidBasepath(swaggerObj.BasePath); !ok {
whisk.Debug(whisk.DbgError, "Swagger file basePath is invalid.\n")
errMsg := wski18n.T("Swagger file basePath must start with a leading slash (/)")
whiskErr := whisk.MakeWskError(errors.New(errMsg), whisk.EXIT_CODE_ERR_GENERAL,
whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
return nil, whiskErr
}
api := new(whisk.Api)
api.Namespace = namespace
api.Swagger = swagger
return api, nil
}